Блин, ты делаешь мне плакать. Следующий камень, который я себе куплю будет ксеон. Он без вариантов бырее по сходной цене. Не сейчас, пока разница не так велика (да и разогнать можно), но на будущее когда раком встанет вопрос о смене проца, однозначно буду брать серверный.
Нужна помошь знатоков по векторным операциям
- Автор темы Andots
- Дата создания
а мне плевать - не расстроился. ЦПУ давно не актуальны. к примеру редшифт имеет все возможные фичи, и на 1080 ренедрит в считанные секунды
приведи, пожалуйста, пример рендера-косяка
+ на куде (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 чутка нехватает,но это так, без твиков и тонкой настройки, быро настроил и зарендерил), кидани мне ссылочку на редшифт с такой же фигней. Да что то подобное на гпу рендерах есть(и на шифте, видел в галере), но все равно видно что не айс, если присмотреться, да и сопряжено с большим гемором по настройке.
Да и будь все так классно как ты думаешь, никто бы не сидел на цпу виреях, менталах итп. Все купили бы Шифт и рендерили за "считанные" минуты, а в галерах тоннами валялись шедевры с этого рендера. Но чет кроме его собственной галеры особо то и не сыщешь.
Последнее редактирование:
у меня нет куды на борту. но есть демка - буду тестить на виртуальном десктопе.
http://render.ru/books/show_book.php?book_id=3477
эта статья меня вдохновила.
Андотс, ты можешь подсказать нормальный куда рендер анбиасед, кроме фурибола
http://render.ru/books/show_book.php?book_id=3477
эта статья меня вдохновила.
Андотс, ты можешь подсказать нормальный куда рендер анбиасед, кроме фурибола
у меня нет куды на борту. но есть демка - буду тестить на виртуальном десктопе.
http://render.ru/books/show_book.php?book_id=3477
эта статья меня вдохновила.
Андотс, ты можешь подсказать нормальный куда рендер анбиасед, кроме фурибола
http://render.ru/books/show_book.php?book_id=3477
эта статья меня вдохновила.
Андотс, ты можешь подсказать нормальный куда рендер анбиасед, кроме фурибола
Последнее редактирование:
Кста, в продолжение наших тут тестов. Ради треньки перевел этот наш тест в с++ как командный плаг для майки и получил интересные результаты. (итерации увеличил в 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 , но видимо что то просто накосячил или задача для ГПУ несвойственная. Если кому интересно тоже попробовать.
Вот тестилка на питоне
И сам плаг(подключить через манагер):
Vector_test.rar
"
-------------------- 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
Вложения
-
37,6 КБ Просмотров: 350
Cтранно. У себя еще раз проверил все работает, вообще при компиляции использовались библиотеки 2017й майки, но не думаю что прям из за этого, по идее простой плаг, должен на любой версии идти, хотя хез. Вот на всяк случай все файлы что скомпились, мож что из них подтягивает к примеру из .lib файла, но сомневаюсь.
Debug.zip
Debug.zip
Вложения
-
352,1 КБ Просмотров: 405
Cтранно. У себя еще раз проверил все работает, вообще при компиляции использовались библиотеки 2017й майки, но не думаю что прям из за этого, по идее простой плаг, должен на любой версии идти, хотя хез. Вот на всяк случай все файлы что скомпились, мож что из них подтягивает к примеру из .lib файла, но сомневаюсь.
Debug.zip
Debug.zip
Пробовал на 2016, дома буду, попробую на 2017.
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
Вложения
-
201,6 КБ Просмотров: 303
Последнее редактирование:
Я проверил на 2014 первый плаг (заменил в гексах версию), таже ругань, библиотек скорее всего нет, там же amp. Новый не проверял, примерный прирост скорости и так понятен.
Замеры мне не так интересны, а интересно что после компиляции в итоге получается.
Беру первый плаг, дебажный не буду смотреть, но по сути там тоже самое будет раз компилятор один, хотя можешь выложить без дебажки второй вариант.
по case селектор режима запуска
с 1,2 понятно, 3 - amp, там винегрет, привет от микрософт, смотреть там нечего, просто для представления что в итоге получается под amp
2 - omp, тут всё красиво
j__vcomp_fork(1i64, 10i64, sub_180048230, &v42);
где sub_180048230 - чистая процедурка наших векторов
1 - это на одном ядре, я так понимаю тут никакой векторизации автоматом не делается, а ты сам разбил вектора на компонеты, ну и в итоге не оптимальный код без векторизации:
Надо добиваться чтобы sse или avх реально вектора считали, а не по одной компонете.
Поэтому и скорость в 100 - это чисто условно, в зависимости от кода может и в 1000 раз быстрее быть.
Замеры мне не так интересны, а интересно что после компиляции в итоге получается.
Беру первый плаг, дебажный не буду смотреть, но по сути там тоже самое будет раз компилятор один, хотя можешь выложить без дебажки второй вариант.
Код:
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);
}
с 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;
Поэтому и скорость в 100 - это чисто условно, в зависимости от кода может и в 1000 раз быстрее быть.
Да я пока в вектора не лез, по факту получилось что при попытке использовать std::vector<float> (хотя это не вектор а контейнер) производительность упала раз в 200, хез почему, равно как не могу понять почему не идет этот плаг на других майках. В данном коде просто повторил питоновскую функцию, ради теста.
Лови исходник , там гораздо понятней все , чем при использовании дизаасемблера.
SSE пока не пробовал, изучаю последовательно, roadmap далее разбираться с кудой. (Ну естейственно когда со стд плюсами разберусь). Вообще крайне мало инфы по этому делу. По сути приходиться разбираться методом тыка, по стандартным функциям срр полно, но это чисто база, а дальше глухо. Даже по sse не найти инфы нормальной. Хотя стоило бы разобраться.
vec.rar
Лови исходник , там гораздо понятней все , чем при использовании дизаасемблера.
SSE пока не пробовал, изучаю последовательно, roadmap далее разбираться с кудой. (Ну естейственно когда со стд плюсами разберусь). Вообще крайне мало инфы по этому делу. По сути приходиться разбираться методом тыка, по стандартным функциям срр полно, но это чисто база, а дальше глухо. Даже по sse не найти инфы нормальной. Хотя стоило бы разобраться.
vec.rar
Вложения
-
1,1 КБ Просмотров: 359
Последнее редактирование:
Лови исходник , там гораздо понятней все , чем при использовании дизаасемблера.
SSE пока не пробовал, изучаю последовательно, roadmap далее разбираться с кудой. (Ну естейственно когда со стд плюсами разберусь). Вообще крайне мало инфы по этому делу. По сути приходиться разбираться методом тыка, по стандартным функциям срр полно, но это чисто база, а дальше глухо. Даже по sse не найти инфы нормальной. Хотя стоило бы разобраться.
И гдет-то бложик буржуя одного, масса интересного по векторам, там он библиотечку для sse векторов свою делал, потом наткнусь напишу.
В куду и опенцл не лазил, тут ничего не скажу, на хабре видел толковые статьи по куде.
Да затер я первый исходник, тупанул, вместо того что просто закоментить удалил и сохранил поверх, ну там вообще не оптимальный алгоритм был, по сути поскольку последовательных циклов для гпу не существует, там создавались вначале в оперативке 3 массива (для summX,summY,summZ) по N (миллиону) нулевых значений. Далее они переносились через array_view в ГПУ и для каждого из них считалось через parallel_for_each формула. Глупая задача для GPU. Потому и результат был не особо. Больше времени тратилось на создание массива и перенос его в gpu. Сами "циклы" исполнялись почти мгновенно. Замер с 1 циклом для summX опережал 3 цикла для x,y,z буквально на 0,0001 - 0002 сек
Больше времени тратилось на создание массива и перенос его в gpu. Сами "циклы" исполнялись почти мгновенно. Замер с 1 циклом для summX опережал 3 цикла для x,y,z буквально на 0,001 - 002 сек
У амп плюс большой что работать будет и на нвидии и на ати, cuda только на нвидии, опецл по разному и там и там, иногда не совместим.