Ядро автокорреляции OpenCL

Я написал простую программу, которая выполняет автокорреляцию следующим образом... Я использовал директивы ускорителя pgi для переноса вычислений на GPU.

//autocorrelation
void autocorr(float *restrict A, float *restrict C, int N)
{
      int i, j;
      float sum;
      #pragma acc region
      {
        for (i = 0; i < N; i++) {
                        sum = 0.0;
                for (j = 0; j < N; j++) {
                    if ((i+j) < N)
                      sum += A[j] * A[i+j];
                    else
                      continue;
               }
            C[i] = sum;
       }
       }
}

Я написал аналогичную программу в OpenCL, но не получаю правильных результатов. Программа выглядит следующим образом... Я новичок в программировании GPU, поэтому, кроме подсказок, которые могут исправить мою ошибку, любые другие советы приветствуются.

__kernel void autocorrel1D(__global double *Vol_IN, __global double *Vol_AUTOCORR, int size)
{

    int j, gid = get_global_id(0);
    double sum = 0.0;

    for (j = 0; j < size; j++) {
            if ((gid+j) < size)
            {
               sum += Vol_IN[j] * Vol_IN[gid+j];
            }
            else
               continue;
               }

    barrier(CLK_GLOBAL_MEM_FENCE);
    Vol_AUTOCORR[gid] = sum;

}

Поскольку я передал измерение равным 1, поэтому я считаю, что мой вызов get_global_size(0) даст мне идентификатор текущего блока, который используется для доступа к входному массиву 1d.

Спасибо,
Саян


person Sayan    schedule 11.05.2011    source источник
comment
Какие результаты вы получаете? Если вы измените Vol_AUTOCORR[gid] = sum; на Vol_AUTOCORR[gid] = gid;, даст ли это вам ожидаемый массив увеличенных значений?   -  person Steve Blackwell    schedule 12.05.2011
comment
Я не вижу здесь проблемы? Какой у вас код хоста? Корректно ли вы передаете данные на устройство и обратно?   -  person Rick-Rainer Ludwig    schedule 13.05.2011
comment
Извините за поздний ответ... с ядром проблем нет, у меня была ошибка в коде хоста, из-за чего результаты были неверными. Спасибо за оценку.   -  person Sayan    schedule 16.05.2011


Ответы (1)


Код правильный. Насколько я знаю, это должно работать нормально и давать правильные результаты.

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

Ваша проблема должна быть за пределами ядра, убедитесь, что вы правильно передаете ввод, и вы берете из GPU правильные данные.

Кстати, я полагаю, что вы используете графический процессор с двойной точностью, поскольку выполняете двойные вычисления. Убедитесь, что вы передаете также двойные значения. Помните, что вы НЕ МОЖЕТЕ указать указатель с плавающей запятой на двойное значение, и наоборот. Это даст вам неправильные результаты.

person DarkZeros    schedule 25.05.2011
comment
Да я заметил, что БАРЬЕР в данном случае не требуется. Спасибо, что указали мне на тип данных. - person Sayan; 26.05.2011