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

Vladimir Gomonov
8292
Vladimir Gomonov  
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"; //;-))
;-)
Sceptic Philozoff
17690
Sceptic Philozoff  
MetaDriver: Мой код всё равно короче и быстрее.  Можешь проверить и на скорость и на эквивалентность;-)
Не, ну это нечестно. Ты с кодом Андрея справься и ускорь его.
Vladimir Gomonov
8292
Vladimir Gomonov  
Mathemat:
Не, ну это нечестно. Ты с кодом Андрея справься и ускорь его.

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

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

:)

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

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

;))))


Andrey Dik
13357
Andrey Dik  
MetaDriver:

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

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

:)

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

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

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

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

Vladimir Gomonov
8292
Vladimir Gomonov  

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

"__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()  скорее всего никакая не функция, а сверхскоростная регистровая операция.

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

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

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

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

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

Sceptic Philozoff
17690
Sceptic Philozoff  
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. Чуть-чуть, но приятно.

Vladimir Gomonov
8292
Vladimir Gomonov  
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";// есть ещё вариант, надёжнее - распечатай результаты и сравни.  ;-)))