PyOpenCL, фильтр массива: copy_if против моей собственной атомарной реализации
У меня есть массив случайных целых чисел. Например [132, 2, 31, 49, 15, 6, 70, 18 ... , 99, 1001]
, Я хочу создать массив всех чисел, например, больше 100 и получить размер этого массива.
Есть два способа:
- Новая функция PyOpenCL
copy_if
, Это основано наGenericScanKernel
и если мы пойдем глубже на префикс сумм. - Чистое решение 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)