Render.ru

Нужна помошь знатоков по векторным операциям

Lemieux

Знаток
Рейтинг
58
#61
Блин, ты делаешь мне плакать. Следующий камень, который я себе куплю будет ксеон. Он без вариантов бырее по сходной цене. Не сейчас, пока разница не так велика (да и разогнать можно), но на будущее когда раком встанет вопрос о смене проца, однозначно буду брать серверный.
Тут скорее сказывается разрыв в поколениях процессоров. Хотя по спекам разница не очень значительна.
 
Рейтинг
327
#62
а мне плевать - не расстроился. ЦПУ давно не актуальны. к примеру редшифт имеет все возможные фичи, и на 1080 ренедрит в считанные секунды
 

Andots

Знаток
Рейтинг
66
#63
а мне плевать - не расстроился. ЦПУ давно не актуальны. к примеру редшифт имеет все возможные фичи, и на 1080 ренедрит в считанные секунды
Ну подобное я уже лет 5 назад слышал, и чет до сих пор ЦПу рендеры актуальны, у ГПУ рендеров есть свои косяки и недостатки. В конечном итоге, пока они разовьются и цпу станет совсем не актуальным, их всех сожрет какой нить realtime DX14 render на GTX6080 :)
 

Andots

Знаток
Рейтинг
66
#65
приведи, пожалуйста, пример рендера-косяка
Нуу, понимаешь вся проблема в том что ты не понимаешь в чем отличаются ГПУ рендеры от ЦПУ. И почему рендерить на 1000+ ядрах иногда хуже чем на 4-8, все упирается в память и способах доступа к ней, для 1000 ядер которые работают одновременно нужно очень много памяти видяхи. Хоть там и пишут что проблема решена и упоротости на этом больше нет (в особенности про редшифт мол ваще 10+милионов и тонны текстур), но по факту пощупать бы ручками и качество и время рендера сравнить со стандартным виреем допустим. На заборе тоже много чего написано.
+ на куде (OpenCL) еще не научились считать все материалы, к примеру абсолютно честного sss пока что нет. Да, есть фейковые через ноды freshner и нормали но это так себе, много танцев с бубном и настраивается под конкретный свет) Не утверждаю, но помоему доси нет многослойных материалов,хотя это обычный композ, наверно есть.

Да, там кухонный столик, вазу у кровати, пару занавесок в кадре, комнату и.т.п на это сгодится, ну если для тебя 3D ограничивается только этим, ну тогда ты прав. Для дизайнеров самое то.

Вот если ты такой знаток редшифта отрендерь ка на нем большую комплексную сцену, ну поликов так 4 -6 млн и с кучкой текстурок с разрешением по так по 6- 8к..+ GI
Лан, у тебя его наверно нет. Его в свободном доступе пока вообще нет, старая бетка валяется.

Кинь ссылку на картинку, ну чтоб примерно так было (не особо выбирал, на скорую руку, есть варианты и покруче гораздо)
http://www.3dtotal.com/admin/new_cropper/gallery_originals/2014-11-28(63503)_Rtpe_1920_3dt.jpg
http://render.ru/gallery/work/88312#work

А вот!, я сегодня по тутору учился настраивать SSS для кожи на арнольде, там вообще одна текстура и примитив настройки(можно было и гораздо лучше сделать если постараться, отражения на носу к примеру перебрал, на лбу да и в общем радиусов sss чутка нехватает,но это так, без твиков и тонкой настройки, быро настроил и зарендерил), кидани мне ссылочку на редшифт с такой же фигней. Да что то подобное на гпу рендерах есть(и на шифте, видел в галере), но все равно видно что не айс, если присмотреться, да и сопряжено с большим гемором по настройке.
333.jpg

Да и будь все так классно как ты думаешь, никто бы не сидел на цпу виреях, менталах итп. Все купили бы Шифт и рендерили за "считанные" минуты, а в галерах тоннами валялись шедевры с этого рендера. Но чет кроме его собственной галеры особо то и не сыщешь.
 
Последнее редактирование:
Рейтинг
327
#66
у меня нет куды на борту. но есть демка - буду тестить на виртуальном десктопе.
http://render.ru/books/show_book.php?book_id=3477
эта статья меня вдохновила.
Андотс, ты можешь подсказать нормальный куда рендер анбиасед, кроме фурибола
 

Andots

Знаток
Рейтинг
66
#67
у меня нет куды на борту. но есть демка - буду тестить на виртуальном десктопе.
http://render.ru/books/show_book.php?book_id=3477
эта статья меня вдохновила.
Андотс, ты можешь подсказать нормальный куда рендер анбиасед, кроме фурибола
Не, не поскажу. Я к ним не очень хорошо отношусь. Для статики мне, не время важней, а удобство настройки, возможности материалов и качество, а так пусть хоть всю ночь финальный рендер делает пока я сплю, не принципиально. Для анимации , ну я например никогда себе не куплю 4 титана или 1080, но и даже так для более менее хорошего рендера потребуется 4-5 минут на кадр в среднем, а это значит что 3х минутный ролик потребует 300 часов рендера... Ну а что то стоящее минут хотя бы на 20-30 (можно из дома на полгода уезжать, и потом заплатить круглую сумму за электричество)... Я уж лучше пожертвую качеством и перегоню все это в unreal или cry и там поковыряюсь. Проще выйдет чем гонять все это время комп, заплатив при этом цену неплохого авто за железо.
 
Последнее редактирование:

Andots

Знаток
Рейтинг
66
#68
Кста, в продолжение наших тут тестов. Ради треньки перевел этот наш тест в с++ как командный плаг для майки и получил интересные результаты. (итерации увеличил в 10 от исходника)
"
-------------------- check
Dark (vector): (-0.0880312, -1.07038, -1.59508)
4i4ikov (scalar): (-0.0880312, -1.07038, -1.59508)

-------------------- bench 1000000
C++ Single Thread External (Python) timer 0.0240001678467
C++ Single Thread Internal timer 0.023

--------------------
C++ Multi Thread External (Python) timer 0.00600004196167
C++ Multi Thread Internal timer 0.006

--------------------
C++ AMP External (Python) timer 0.0189998149872
C++ AMP Internal timer 0.018

--------------------
4i4ikov (scalar): 2.24899983406
Dark (vector): 1.58899998665

"
По факту получилось что плюсы в сотни раз быстрее питона.
Правда AMP отстал от OMP , но видимо что то просто накосячил или задача для ГПУ несвойственная. Если кому интересно тоже попробовать.
Вот тестилка на питоне
Код:
import maya.cmds as cmds

import maya.api.OpenMaya as Om

def vectorTest_4i4ikov(v1,v2,v3):
    v21 = v2-v1
    v13 = v1-v3
    v23 = v2-v3
    k = ((v13*v13)-(v23*v23))/(2*v21*v21) + 0.5
    return v2*k+v1*(1-k)
   
def vectorTest_Dark(v1,v2,v3):
    v21 = v2-v1
    return v1+(v3-v1)*v21*v21/(v21*v21)

import time
class new_Bench:
    mera = time.time
    #mera = time.clock
    def __init__(self):
        self.time=self.mera()
    def reset(self):
        self.__init__()
    def get(self):
        self.time = self.mera() - self.time
        return self.time

v1 = Om.MVector(5.111 , -2.046, -1.956)
v2 = Om.MVector(-5.419 , -0.070 , -1.225)
v3 = Om.MVector( -0.246 , 0 , -6.764)

Ax = v1[0]
Ay = v1[1]
Az = v1[2]

Bx = v2[0]
By = v2[1]
Bz = v2[2]

Cx = v3[0]
Cy = v3[1]
Cz = v3[2]


print '\n','-'*20,'check'
print 'Dark    (vector):',vectorTest_Dark(v1,v2,v3)
print '4i4ikov (scalar):',vectorTest_4i4ikov(v1,v2,v3)

Bench = new_Bench()
N = 1000000
print '\n','-'*20,'bench',N

Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,1)
print 'C++ Single Thread External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ Single Thread Internal timer',r

print '\n','-'*20

Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,2)
print 'C++ Multi Thread External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ Multi Thread Internal timer',r

print '\n','-'*20

Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,3)
print 'C++ AMP  External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ AMP Internal timer',r

print '\n','-'*20

Bench.reset()
for i in xrange(1,N):vectorTest_4i4ikov(v1/i,v2/i,v3/i)
print '4i4ikov (scalar):',Bench.get()

Bench.reset()
for i in xrange(1,N): vectorTest_Dark(v1/i,v2/i,v3/i)
print 'Dark    (vector):',Bench.get()
И сам плаг(подключить через манагер):

Vector_test.rar
 

Вложения

Lemieux

Знаток
Рейтинг
58
#69
Не работает. При подключении плагина пишет - "Нет модуля Vector_Test". При выполнении скрипта пишет - "'module' object has no attribute 'VecTest'" :)
 

Andots

Знаток
Рейтинг
66
#70
Cтранно. У себя еще раз проверил все работает, вообще при компиляции использовались библиотеки 2017й майки, но не думаю что прям из за этого, по идее простой плаг, должен на любой версии идти, хотя хез. Вот на всяк случай все файлы что скомпились, мож что из них подтягивает к примеру из .lib файла, но сомневаюсь.
Debug.zip
 

Вложения

  • 352,1 КБ Просмотров: 318

Lemieux

Знаток
Рейтинг
58
#71
Cтранно. У себя еще раз проверил все работает, вообще при компиляции использовались библиотеки 2017й майки, но не думаю что прям из за этого, по идее простой плаг, должен на любой версии идти, хотя хез. Вот на всяк случай все файлы что скомпились, мож что из них подтягивает к примеру из .lib файла, но сомневаюсь.
Debug.zip
Пробовал на 2016, дома буду, попробую на 2017.
 

Andots

Знаток
Рейтинг
66
#72
Пробовал на 2016, дома буду, попробую на 2017.
Мда, скорей всего будет работать тока на 2017 , мож поставлю 2015 и компильну для нее. Буш запускать запускай тот что ниже по тектсу, я его честнее сделал. В c++ в цикле 3 деления на i , а в питоновском 9 делений.Там же вектор из 3 величин (сразу не подумал), переделал на 9 делений и добавил double для проверки скорости. АМП вообще убрал. По итогу получается что на моем камне плюсы ровно в 100 с копейками раз быстрее при многоядерности чем питон
0.013 сек против 1.58 . Нехило однако.


Теперь вот что выдает
"
-------------------- bench 1000000
C++ Single Thread (Float) External (Python) timer 0.0460000038147
C++ Single Thread (Float) Internal timer 0.045

--------------------
C++ Multi Thread (Float) External (Python) timer 0.0130000114441
C++ Multi Thread (Float) Internal timer 0.012

--------------------
C++ Single Thread (Double) External (Python) timer 0.0950000286102
C++ Single Thread (Double) Internal timer 0.094

--------------------
C++ Multi Thread (Double) External (Python) timer 0.0199999809265
C++ Multi Thread (Double) Internal timer 0.02

--------------------
4i4ikov (scalar): 2.26800012589
Dark (vector): 1.58299994469

"
Скрипт на питоне

Код:
import maya.cmds as cmds

import maya.api.OpenMaya as Om

def vectorTest_4i4ikov(v1,v2,v3):
    v21 = v2-v1
    v13 = v1-v3
    v23 = v2-v3
    k = ((v13*v13)-(v23*v23))/(2*v21*v21) + 0.5
    return v2*k+v1*(1-k)
 
def vectorTest_Dark(v1,v2,v3):
    v21 = v2-v1
    return v1+(v3-v1)*v21*v21/(v21*v21)

import time
class new_Bench:
    mera = time.time
    #mera = time.clock
    def __init__(self):
        self.time=self.mera()
    def reset(self):
        self.__init__()
    def get(self):
        self.time = self.mera() - self.time
        return self.time

v1 = Om.MVector(5.111 , -2.046, -1.956)
v2 = Om.MVector(-5.419 , -0.070 , -1.225)
v3 = Om.MVector( -0.246 , 0 , -6.764)

Ax = v1[0]
Ay = v1[1]
Az = v1[2]

Bx = v2[0]
By = v2[1]
Bz = v2[2]

Cx = v3[0]
Cy = v3[1]
Cz = v3[2]


print '\n','-'*20,'check'
print 'Dark    (vector):',vectorTest_Dark(v1,v2,v3)
print '4i4ikov (scalar):',vectorTest_4i4ikov(v1,v2,v3)

Bench = new_Bench()
N = 1000000
print '\n','-'*20,'bench',N

Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,1)
print 'C++ Single Thread (Float) External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ Single Thread (Float) Internal timer',r

print '\n','-'*20

Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,2)
print 'C++ Multi Thread (Float) External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ Multi Thread (Float) Internal timer',r

print '\n','-'*20

Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,4)
print 'C++ Single Thread (Double)  External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ Single Thread (Double) Internal timer',r

print '\n','-'*20


Bench.reset()
d = cmds.VecTest(Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,N,3)
print 'C++ Multi Thread (Double)  External (Python) timer',Bench.get()
r = float(d)/1000
print 'C++ Multi Thread (Double) Internal timer',r

print '\n','-'*20

Bench.reset()
for i in xrange(1,N):vectorTest_4i4ikov(v1/i,v2/i,v3/i)
print '4i4ikov (scalar):',Bench.get()

Bench.reset()
for i in xrange(1,N): vectorTest_Dark(v1/i,v2/i,v3/i)
print 'Dark    (vector):',Bench.get()
И новый плаг
Debug2.zip
 

Вложения

Последнее редактирование:

Lemieux

Знаток
Рейтинг
58
#73
Может я кривой и неправильно устанавливаю, но пишет - "Не найден указанный модуль". Файлы из архива скинул в maya2017/bin/plug ins
 

Andots

Знаток
Рейтинг
66
#74
Может я кривой и неправильно устанавливаю, но пишет - "Не найден указанный модуль". Файлы из архива скинул в maya2017/bin/plug ins
Ваще странно, у меня идеально подключается, надо дождаться чтоб еще кто нить попробовал. Так ты mll файл через Плагин Манагер подключаешь к майке?
 

Lemieux

Знаток
Рейтинг
58
#75
Ваще странно, у меня идеально подключается, надо дождаться чтоб еще кто нить попробовал. Так ты mll файл через Плагин Манагер подключаешь к майке?
Ну да, во время подключения вылетает эта ошибка
 

4i4ikov

Знаток
Рейтинг
37
#76
Я проверил на 2014 первый плаг (заменил в гексах версию), таже ругань, библиотек скорее всего нет, там же amp. Новый не проверял, примерный прирост скорости и так понятен.

Замеры мне не так интересны, а интересно что после компиляции в итоге получается.
Беру первый плаг, дебажный не буду смотреть, но по сути там тоже самое будет раз компилятор один, хотя можешь выложить без дебажки второй вариант.

Код:
int __usercall vectorTest_Dark@<eax>(__int64 a1@<rcx>, __int64 MStatus@<rdx>, __int64 args@<r8>, __int128 *_XMM0@<xmm0>, __int128 *_XMM1@<xmm1>)
{
  v5 = &v22;
  for ( i = 894i64; i; --i )
  {
    *v5 = -858993460;
    v5 += 4;
  }
  v74 = -2i64;
  v85 = &N ^ _security_cookie;
  *(&N + 1) = MArgList::asInt(args, 9u, 0i64);
  selector = MArgList::asInt(args, 10u, 0i64);
  v7 = MArgList::asDouble(args, 0, 0i64);
  v34 = v7;
  v8 = MArgList::asDouble(args, 1u, 0i64);
  v35 = v8;
  v9 = MArgList::asDouble(args, 2u, 0i64);
  v36 = v9;
  v10 = MArgList::asDouble(args, 3u, 0i64);
  v37 = v10;
  v11 = MArgList::asDouble(args, 4u, 0i64);
  v38 = v11;
  v12 = MArgList::asDouble(args, 5u, 0i64);
  v39 = v12;
  v13 = MArgList::asDouble(args, 6u, 0i64);
  v40 = v13;
  v14 = MArgList::asDouble(args, 7u, 0i64);
  v41 = v14;
  v15 = MArgList::asDouble(args, 8u, 0i64);
  v42 = v15;
  v43 = clock();
  switch ( selector )
  {
    case 1:                                     // one
      for ( j = 1; j < *(&N + 1); ++j )
      {
        v45 = v37 - v34;
        v46 = v38 - v35;
        v47 = v39 - v36;
        v48 = v34 + (((((v40 - v34) * (v37 - v34)) * (v37 - v34)) / ((v37 - v34) * (v37 - v34))) / j);
        v49 = v35 + (((((v41 - v35) * (v38 - v35)) * (v38 - v35)) / ((v38 - v35) * (v38 - v35))) / j);
        v50 = v36 + (((((v42 - v36) * (v39 - v36)) * (v39 - v36)) / ((v39 - v36) * (v39 - v36))) / j);
      }
      break;
    case 2:                                     // omp
      v31 = &N + 4;
      v30 = &v34;
      v29 = &v35;
      v28 = &v36;
      v27 = &v37;
      v26 = &v38;
      v25 = &v39;
      v24 = &v40;
      v23 = &v41;
      j__vcomp_fork(1i64, 10i64, sub_180048230, &v42);
      break;
    case 3:                                     // amp
      v51 = *(&N + 1);
      sub_18001B2F3(&v52, 32i64);
      sub_18001BA14(&v52, v51);
      sub_18001B2F3(&v53, 32i64);
      sub_18001BA14(&v53, v51);
      sub_18001B2F3(&v54, 32i64);
      sub_18001BA14(&v54, v51);
      v55 = v34;
      v56 = v35;
      v57 = v36;
      v58 = v37;
      v59 = v38;
      v60 = v39;
      v61 = v40;
      v62 = v41;
      v63 = v42;
      sub_18001B933(&v64, 32i64);
      sub_18001B190(&v64);
      sub_18001B33E(&v65, 8i64);
      Concurrency::accelerator::accelerator(&v65);
      LODWORD(v16) = sub_18001B992(&v65, &v75);
      v83 = v16;
      v84 = v16;
      sub_18001B4A1(v16);
      sub_18001B9B5(&v75);
      sub_18001BA23(&v66, 3i64, &v55);
      sub_18001BA23(&v67, 3i64, &v58);
      sub_18001BA23(&v68, 3i64, &v61);
      sub_18001B5F0(&v69, v51, &v52);
      sub_18001B5F0(&v70, v51, &v53);
      sub_18001B5F0(&v71, v51, &v54);
      sub_18001BAE1(&v69);
      sub_18001BAE1(&v70);
      sub_18001BAE1(&v71);
      v23 = &v67;
      v83 = sub_18003E840(&v76);
      v84 = v83;
      LODWORD(v17) = sub_18001BBA9(&v69, &v77);
      sub_18001B6F4(v17, v84);
      sub_1800406C0(&v76);
      sub_18001BA5A(&v69, 1i64);
      v23 = &v67;
      v83 = sub_18003EA20(&v78);
      v84 = v83;
      LODWORD(v18) = sub_18001BBA9(&v70, &v79);
      sub_18001B4E7(v18, v84);
      sub_180040820(&v78);
      sub_18001BA5A(&v70, 1i64);
      v23 = &v67;
      v83 = sub_18003E930(&v80);
      v84 = v83;
      LODWORD(v19) = sub_18001BBA9(&v71, &v81);
      sub_18001BB09(v19, v84);
      sub_180040770(&v80);
      sub_18001BA5A(&v71, 1i64);
      sub_18001B997(&v71);
      sub_18001B997(&v70);
      sub_18001B997(&v69);
      sub_18001B997(&v68);
      sub_18001B997(&v67);
      sub_18001B997(&v66);
      Concurrency::accelerator::~accelerator(&v65);
      sub_18001B44C(&v64);
      sub_18001B609(&v54);
      sub_18001B609(&v53);
      sub_18001B609(&v52);
      break;
  }
  v20 = clock();
  v72 = v20;
  v73 = v20 - v43;
  MPxCommand::setResult(v20 - v43);
  MStatus::MStatus(MStatus, 0i64);
  sub_18001B479(&v22, &unk_1800553B0);
  return sub_18001BA28(&N ^ v85);
}
по case селектор режима запуска
с 1,2 понятно, 3 - amp, там винегрет, привет от микрософт, смотреть там нечего, просто для представления что в итоге получается под amp

2 - omp, тут всё красиво
j__vcomp_fork(1i64, 10i64, sub_180048230, &v42);
где sub_180048230 - чистая процедурка наших векторов

1 - это на одном ядре, я так понимаю тут никакой векторизации автоматом не делается, а ты сам разбил вектора на компонеты, ну и в итоге не оптимальный код без векторизации:
Код:
  case 1:                                     // one
      for ( j = 1; j < *(&N + 1); ++j )
      {
        __asm
        {
          movss   xmm0, [rbp+0D90h+var_CEC]
          subss   xmm0, [rbp+0D90h+var_D4C]
          movss   [rbp+0D90h+var_BBC], xmm0
          movss   xmm0, [rbp+0D90h+var_CCC]
          subss   xmm0, [rbp+0D90h+var_D2C]
          movss   [rbp+0D90h+var_B9C], xmm0
          movss   xmm0, [rbp+0D90h+var_CAC]
          subss   xmm0, [rbp+0D90h+var_D0C]
          movss   [rbp+0D90h+var_B7C], xmm0
          movss   xmm0, [rbp+0D90h+var_C8C]
          subss   xmm0, [rbp+0D90h+var_D4C]
          mulss   xmm0, [rbp+0D90h+var_BBC]
          mulss   xmm0, [rbp+0D90h+var_BBC]
          movss   xmm1, [rbp+0D90h+var_BBC]
          mulss   xmm1, [rbp+0D90h+var_BBC]
          divss   xmm0, xmm1
          cvtsi2ss xmm1, [rbp+0D90h+var_BDC]
          divss   xmm0, xmm1
          movss   xmm1, [rbp+0D90h+var_D4C]
          addss   xmm1, xmm0
        }
        _XMM0 = _XMM1;
        __asm
        {
          movss   [rbp+0D90h+var_B58], xmm0
          movss   xmm0, [rbp+0D90h+var_C6C]
          subss   xmm0, [rbp+0D90h+var_D2C]
          mulss   xmm0, [rbp+0D90h+var_B9C]
          mulss   xmm0, [rbp+0D90h+var_B9C]
          movss   xmm1, [rbp+0D90h+var_B9C]
          mulss   xmm1, [rbp+0D90h+var_B9C]
          divss   xmm0, xmm1
          cvtsi2ss xmm1, [rbp+0D90h+var_BDC]
          divss   xmm0, xmm1
          movss   xmm1, [rbp+0D90h+var_D2C]
          addss   xmm1, xmm0
        }
        _XMM0 = _XMM1;
        __asm
        {
          movss   [rbp+0D90h+var_B54], xmm0
          movss   xmm0, [rbp+0D90h+var_C4C]
          subss   xmm0, [rbp+0D90h+var_D0C]
          mulss   xmm0, [rbp+0D90h+var_B7C]
          mulss   xmm0, [rbp+0D90h+var_B7C]
          movss   xmm1, [rbp+0D90h+var_B7C]
          mulss   xmm1, [rbp+0D90h+var_B7C]
          divss   xmm0, xmm1
          cvtsi2ss xmm1, [rbp+0D90h+var_BDC]
          divss   xmm0, xmm1
          movss   xmm1, [rbp+0D90h+var_D0C]
          addss   xmm1, xmm0
        }
        _XMM0 = *&_XMM1;
        __asm { movss   [rbp+0D90h+var_B50], xmm0 }
      }
      break;
Надо добиваться чтобы sse или avх реально вектора считали, а не по одной компонете.
Поэтому и скорость в 100 - это чисто условно, в зависимости от кода может и в 1000 раз быстрее быть.
 

Andots

Знаток
Рейтинг
66
#77
Да я пока в вектора не лез, по факту получилось что при попытке использовать std::vector<float> (хотя это не вектор а контейнер) производительность упала раз в 200, хез почему, равно как не могу понять почему не идет этот плаг на других майках. В данном коде просто повторил питоновскую функцию, ради теста.
Лови исходник , там гораздо понятней все , чем при использовании дизаасемблера.

SSE пока не пробовал, изучаю последовательно, roadmap далее разбираться с кудой. (Ну естейственно когда со стд плюсами разберусь). Вообще крайне мало инфы по этому делу. По сути приходиться разбираться методом тыка, по стандартным функциям срр полно, но это чисто база, а дальше глухо. Даже по sse не найти инфы нормальной. Хотя стоило бы разобраться.

vec.rar
 

Вложения

  • 1,1 КБ Просмотров: 302
Последнее редактирование:

4i4ikov

Знаток
Рейтинг
37
#78
Лови исходник , там гораздо понятней все , чем при использовании дизаасемблера.
Как раз наооборот))) непонятно где там amp? ты первый исходник дай с amp по case 3

SSE пока не пробовал, изучаю последовательно, roadmap далее разбираться с кудой. (Ну естейственно когда со стд плюсами разберусь). Вообще крайне мало инфы по этому делу. По сути приходиться разбираться методом тыка, по стандартным функциям срр полно, но это чисто база, а дальше глухо. Даже по sse не найти инфы нормальной. Хотя стоило бы разобраться.
По sse у ител полный справочник по simd https://software.intel.com/sites/landingpage/IntrinsicsGuide/
И гдет-то бложик буржуя одного, масса интересного по векторам, там он библиотечку для sse векторов свою делал, потом наткнусь напишу.
В куду и опенцл не лазил, тут ничего не скажу, на хабре видел толковые статьи по куде.
 

Andots

Знаток
Рейтинг
66
#79
Да затер я первый исходник, тупанул, вместо того что просто закоментить удалил и сохранил поверх, ну там вообще не оптимальный алгоритм был, по сути поскольку последовательных циклов для гпу не существует, там создавались вначале в оперативке 3 массива (для summX,summY,summZ) по N (миллиону) нулевых значений. Далее они переносились через array_view в ГПУ и для каждого из них считалось через parallel_for_each формула. Глупая задача для GPU. Потому и результат был не особо. Больше времени тратилось на создание массива и перенос его в gpu. Сами "циклы" исполнялись почти мгновенно. Замер с 1 циклом для summX опережал 3 цикла для x,y,z буквально на 0,0001 - 0002 сек
 

4i4ikov

Знаток
Рейтинг
37
#80
Больше времени тратилось на создание массива и перенос его в gpu. Сами "циклы" исполнялись почти мгновенно. Замер с 1 циклом для summX опережал 3 цикла для x,y,z буквально на 0,001 - 002 сек
А это общая клиника для гпу расчетов, ввод и ввывод данных - потеря скорости.
У амп плюс большой что работать будет и на нвидии и на ати, cuda только на нвидии, опецл по разному и там и там, иногда не совместим.
 
Сверху