Я написал простую программу, которая выполняет автокорреляцию следующим образом... Я использовал директивы ускорителя 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.
Спасибо,
Саян
Vol_AUTOCORR[gid] = sum;
наVol_AUTOCORR[gid] = gid;
, даст ли это вам ожидаемый массив увеличенных значений? - person Steve Blackwell   schedule 12.05.2011