PyOpenCL, фильтр массива: copy_if против моей собственной атомарной реализации

У меня есть массив случайных целых чисел. Например [132, 2, 31, 49, 15, 6, 70, 18 ... , 99, 1001], Я хочу создать массив всех чисел, например, больше 100 и получить размер этого массива.

Есть два способа:

  1. Новая функция PyOpenCL copy_if, Это основано на GenericScanKernelи если мы пойдем глубже на префикс сумм.
  2. Чистое решение OpenCL, которое использовало Atomics

Есть ли copy_if всегда работает правильно? Как я вижу copy_if не использует атомные. Возможно ли столкнуться с проблемой использования copy_if?

Как насчет производительности copy_if по сравнению с атомным способом?

Что бы вы выбрали и почему?

1 ответ

Я никогда не видел ошибку с copy_if, Всегда одни и те же результаты; это кажется очень надежным. (Я не построил модульные тесты, хотя.)

Что касается производительности, copy_if должно быть намного быстрее, особенно если ваш графический процессор работает быстро. Как уже говорили другие, атомные и графические процессоры - плохая комбинация (я слишком много пострадал, чтобы научиться этому...)

И если количество ожидаемых результатов мало по сравнению с вашим набором данных, я предложил sparse_copy_if() метод здесь--- где вы также можете найти copy_if пример.

Форк мой код и следующее должно работать:

from my_pyopencl_algorithm import copy_if 
final_gpu, evt = my_pyopencl_algorithm.sparse_copy_if(array_gpu, "ary[i] > 100", queue = queue)
Другие вопросы по тегам