2

このシリアルコードのカーネルを作成するのに問題があります:

void distlag(double *x, double *y,double *data, double *ncoord, double *res)
{
    // x: x-coordinate
    // y: y-coordinate
    // data: value associated with x-y coordinate
    // ncoord: number of coordinates
    int i=0, j=0;
    double u=0.0, v=0.0, lags=0.0;
    for(i=0;i<(ncoord[0]-1);i++)
        for(j=(i+1); j<ncoord[0];j++)
        {
            // Pairwise distances
            lags=hypot(x[i]-x[j],y[i]-y[j]);
            u=data[i]; 
            v=data[j]; 
            *res+= u+v+lags;
        } 
    }

hypot主な問題は、距離が同じベクトルの値に依存することだと思います。または、j値が に依存している可能性がありますi。OpenCL を使用してこのコードを並列化するにはどうすればよいですか?

(より詳しい情報:)

この投稿に続いて、最初に上三角距離行列の値を取得することから始めました。これはカーネルコードです:

__kernel void totexp(__global float *x, __global float *xauto, int n)
{
int num_wrk_items  = get_local_size(0);
int local_id       = get_local_id(0);
int group_id       = get_group_id(0);
int j, gid = get_global_id(0);
float sum = 0.0;


for (j = 0; j < n; j++) 
{
if ( ((gid+j)!= j) && ((gid+j) < n)) 
       {
   sum = fabs(x[j]-x[gid+j]);
        }
        else
            continue;
  }
  xauto[gid] = sum;
}

int n(xは(1,2,3,4,5,6,7,8)lengthx等しい) です。次に、n(n-1)/2値が必要です (例では合計 28)。グローバルとローカルのワーク サイズをn(8) に設定しました。およびのcl_memバッファ オブジェクトのサイズは、それぞれ( 28) です。しかし、結果を読み返すと、28 個の値が得られますが、期待される値ではありません。私は得る: (0,7,12,15,16,15,12,7,0,0,0...,0)。何か助けはありますか?xxautonn(n-1)/2

4

0 に答える 0