2011-05-11 5 views
0

다음과 같이 자기 상관을 수행하는 간단한 프로그램을 작성했습니다 ... 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를 줄 것입니다.

감사합니다,
사얀

+0

결과가 어떻게됩니까? 'Vol_AUTOCORR [gid] = sum;'을'Vol_AUTOCORR [gid] = gid;'로 변경하면 예상되는 증가 값의 배열을 얻을 수 있습니까? –

+0

여기에 문제가 표시되지 않습니까? 귀하의 호스트 코드는 무엇입니까? 데이터를 장치로 올바르게 전송 했습니까? –

+0

늦게 답장을 보내 주셔서 죄송합니다 ... 커널에 문제가 없습니다. 호스트 코드에 실수가있어서 결과가 잘못되었습니다. 평가 해 주셔서 감사합니다. – Sayan

답변

1

이 코드는 올바른 것입니다. 내가 아는 한, 그것은 잘 실행하고 corret 결과를 제공해야합니다.

barrier (CLK_GLOBAL_MEM_FENCE);은 필요하지 않습니다. 그 문장 없이는 더 많은 속도를 얻을 수 있습니다.

문제가 커널 외부에 있는지, 입력을 올바르게 전달했는지, GPU에서 정확한 데이터를 가져 오는지 확인하십시오.

나는 당신이 double calcs를 할 때 double precision suported GPU를 사용하고 있습니다. 이중 값도 전달하는지 확인하십시오. float 포인터가 double 값을 가리 키지 않고, viceversa를 가리킬 수 있습니다. 그것은 당신에게 잘못된 결과를 줄 것입니다.

+0

예이 경우 배리어가 필요하지 않은 것으로 나타났습니다. 데이터 유형을 알려준 주셔서 감사합니다. – Sayan