다음과 같이 자기 상관을 수행하는 간단한 프로그램을 작성했습니다 ... pgi 가속기 지시문을 사용하여 계산을 GPU로 이동했습니다.OpenCL 자기 상관 커널
//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 프로그래밍에 익숙하지 않으므로 다른 오류를 수정할 수있는 힌트를 제외하고 다른 조언도 환영합니다. 내가 1로 치수를 통과, 그래서 내 get_global_size을 고려하고 있기 때문에
__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;
}
(0) 호출은 나에게 입력 1D 배열에 액세스하는 데 사용되는 현재 블록의 ID를 줄 것입니다.
감사합니다,
사얀
결과가 어떻게됩니까? 'Vol_AUTOCORR [gid] = sum;'을'Vol_AUTOCORR [gid] = gid;'로 변경하면 예상되는 증가 값의 배열을 얻을 수 있습니까? –
여기에 문제가 표시되지 않습니까? 귀하의 호스트 코드는 무엇입니까? 데이터를 장치로 올바르게 전송 했습니까? –
늦게 답장을 보내 주셔서 죄송합니다 ... 커널에 문제가 없습니다. 호스트 코드에 실수가있어서 결과가 잘못되었습니다. 평가 해 주셔서 감사합니다. – Sayan