OpenCL: внутренние тесты реализации в MQL5 - страница 44

 
joo:

Похоже, что да.

Не уверен, потому что стараюсь не использовать хитрые конструкции (тяжело воспринимается на глаз), но наверное зря, так как это может ускорять код.

Твой код должен быть, наверное, медленнее, так как на каждой итерации цикла заново объявляется переменная b.

Мой код всё равно короче и быстрее.  Можешь проверить и на скорость и на эквивалентность
"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   int i = get_global_id(0);                               \r\n"
"   out[i]= i;                                              \r\n"
"  }                                                        \r\n"; //;-))
;-)
 
MetaDriver: Мой код всё равно короче и быстрее.  Можешь проверить и на скорость и на эквивалентность;-)
Не, ну это нечестно. Ты с кодом Андрея справься и ускорь его.
 
Mathemat:
Не, ну это нечестно. Ты с кодом Андрея справься и ускорь его.

А я что сделал?

От оптимизатора требуется что? Уменьшение накладных расходов при сохранении еквивалентности результатов! Так проверь, всё сходится до копейки.

:)

// Кстати !! Этот код не роняет мой драйвер даже при #define BUF_SIZE 1024*1024*4    !!!

// Это прорыв! 

;))))

 
MetaDriver:

А я что сделал?

От оптимизатора требуется что? Уменьшение накладных расходов при сохранении еквивалентности результатов! Так проверь, всё сходится до копейки.

:)

Сходится? как проверил? :O
 
joo:
Сходится? как проверил? :O
Как, как!  На калькуляторе!  Запустил восемь штук параллельно и проверил.
 
MetaDriver:
Как, как!  На калькуляторе!  Запустил восемь штук параллельно и проверил.

Врёт твой куркулятор. :)

В цикле складываются 0+1+2+3+...+99999999. Причем через каждые 10000 шагов значение равно 0.

А ты чего зделал? - присвоил номер мухи и всё. Как же могут результаты мои и твои совпасть?

 

Я тут слегка покурил и заподозрил, что вот так

"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   out[get_global_id(0)]= get_global_id(0);                \r\n"
"  }                                                        \r\n";

будет работать ещё быстрее.  Дело в том, что  get_global_id()  скорее всего никакая не функция, а сверхскоростная регистровая операция.

без профайлера не проверить. если кому шибко надо, и захотит - просьба доложить о результатах из студии в студию.  пригодится.
 
MetaDriver:

От оптимизатора требуется что? Уменьшение накладных расходов при сохранении еквивалентности результатов! Так проверь, всё сходится до копейки.

// Кстати !! Этот код не роняет мой драйвер даже при #define BUF_SIZE 1024*1024*4    !!!

Покурил подольше и расстроился.  С другой-то стороны - раз драйвер не роняет, значит эквивалентность по результату уже неполная.

Блин..   Какой облом.  :(

 
MetaDriver: Покурил подольше и расстроился.  С другой-то стороны - раз драйвер не роняет, значит эквивалентность по результату уже неполная.

Не-е, плохо ты курил.

1^3 + 2^3 + 3^3 + ... + 1000000000^3 = 1000000000^2 * (1000000000 + 1)^2 / 4

Слева и справа - одно и то же, полная эквивалентность.

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

P.S. Апгрейднулся на OpenCL 1.2 (это бета). Прошу обратить внимание на маленькое дополнение после номера версии - sse2.

2012.03.22 07:43:28     Terminal        CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80GHz with OpenCL 1.2 (2 units, 2793 MHz, 7912 Mb, version 2.0 (sse2))

Не сказать, что кардинально, но на некоторых тестах ускорился. Скажем, на Tast_Mand_ (ну ты извращенец, Андрюха) - процентов на 5-10. Чуть-чуть, но приятно.

 
joo:

Врёт твой куркулятор. :)

В цикле складываются 0+1+2+3+...+99999999. Причем через каждые 10000 шагов значение равно 0.

А ты чего зделал? - присвоил номер мухи и всё. Как же могут результаты мои и твои совпасть?

Я тебе дал почти сутки на одуматься проверку.  Ты усё ещё настаиваешь? :)

Давай посмотрим:

// Это твой код (оригинал)
"  {                                \r\n"
"   int i = get_global_id(0);       \r\n"
"   for(int u=0;u<100000000;u++)   \r\n"
"   {                           \r\n"
"    out[i]+=u;              \r\n"  
"    if(out[i]>10000)     \r\n"
"      out[i]=0;         \r\n" // после десятитысячного шага итерации этот оператор начнёт выполняться в каждом цикле.
"   }                    \r\n" // т.е. на выходе из цикла по любому будем иметь out[i] = 0;
"   out[i]+= i;          \r\n" // ecли к нулю прибавить номер мухи то получится... сам посчитай..... на калькуляторе... :)
"  }                     \r\n";// есть ещё вариант, надёжнее - распечатай результаты и сравни.  ;-)))