Какая память подходит для этого ядра OpenCL?

Я пытался сделать FFT в OpenCL. У меня это сработало с таким ядром,

     __kernel void butterfly(__global float2* twid, __global float2* X,
                    const int n,}
     {

        /* Butterfly structure*/
     }

Я называю это ядром тысячи раз. Таким образом, чтение/запись в глобальную память занимает слишком много времени. Массив twid(float2) просто читается, никогда не обрабатывается, а массив X является типом массива READ & WRITE.

1.Какой наиболее подходящий тип памяти для этого? 2. Если я использую локальную память, смогу ли я передать ее другому ядру в качестве аргумента, не копируя ее в глобальную память?

Я новичок в OpenCL.


person Karthik Hegde    schedule 24.03.2014    source источник


Ответы (2)


Локальная память может использоваться только внутри рабочей группы; он не виден другим рабочим группам и не может использоваться другими ядрами. Только глобальная память и образы и те вещи.

Думайте о локальной памяти как об управляемом пользователем кеше, используемом для ускорения множественного доступа к одной и той же глобальной памяти в рабочей группе.

person Dithermaster    schedule 25.03.2014

Если вы выполняете БПФ для небольших блоков, вы можете вписаться в частную память. В противном случае, как сказал Дитермастер, используйте локальную память.

Кроме того, я реализовал несколько ядер FFT и настоятельно рекомендую вам избегать использования схемы бабочки, если вы не уверены в ней на 100%. Простые схемы (даже умножение матриц) могут показать лучшие результаты из-за векторизации и хороших шаблонов доступа к памяти. Схема «бабочка» оптимизирована для последовательной обработки. На GPU может показывать низкую производительность.

person Roman Arzumanyan    schedule 25.03.2014
comment
С оптимизированной бабочкой производительность выше даже CUDAFFT! Он работает на порядок быстрее, чем стандартный OpenCL-PyFFT! - person Karthik Hegde; 25.03.2014
comment
Разве частная память не такая же, как постоянная память? - person Karthik Hegde; 25.03.2014