0

グローバル関数への入力として多数の配列を提供する必要がある状況に遭遇しました。他のスレッドがコピーする方法に影響を与えないように、各スレッドが配列に対して操作を実行できるようにする必要があります。配列、達成しようとしているものの例として、以下のコードを提供します。

__global__ void testLocalCopy(double *temper){

     int threadIDx = threadIdx.x + blockDim.x * blockIdx.x; 

     // what I need is for each thread to set temper[3] to its id without affecting any other threads copy
    // so thread id 0 will have a set its copy of temper[3] to 0 and thread id 3 will set it to 3 etc.
     temper[3]=threadIDx;
     printf("For thread  %d  the val in temper[3] is   %lf \n",threadIDx,temper[3]);

}

言い直すと、特定のスレッドが他のスレッドがtemper[3]の値を更新していないことを確認できる方法はありますか?

私は当初、定数メモリを使用することでこの問題を解決できると信じていましたが、定数メモリは読み取り専用であるため、これは私のニーズを満たしていませんでした。

私は cuda 4.0 を使用しています。以下のメイン関数を参照してください。

int main(){

    double temper[4]={2.0,25.9999,55.3,66.6};
double *dev_temper;
int size=4;


    cudaMalloc( (void**)&dev_temper, size * sizeof(double) );
cudaMemcpy( dev_temper, &temper, size * sizeof(double), cudaMemcpyHostToDevice );


testLocalCopy<<<2,2>>>(dev_temper);
cudaDeviceReset();

cudaFree(dev_temper);

}

前もって感謝します、 コナー

4

1 に答える 1

1

カーネル関数内で、次のようにメモリを割り当てることができます

inttemper_per_thread[4];

これで、各スレッドはカーネル内のこの配列に個別かつ一意にアクセスできるようになります。たとえば、以下のコードtemper_per_threadは現在のスレッド インデックスを入力します。

Temper_per_thread[0]=threadIDx;

Temper_per_thread[1]=threadIDx;

Temper_per_thread[2]=threadIDx;

Temper_per_thread[3]=threadIDx;

もちろん、これらすべてのスレッド固有の配列を CPU に転送したい場合は、別のアプローチが必要になります。1) グローバル メモリの大部分を割り当てます。2) グローバル メモリのこの大きな部分のサイズは、スレッドの数に各スレッドに固有の要素の数を掛けたものになります。3) 各スレッドが常にグローバル メモリ内の一意の場所に書き込むように、配列の書き込みにインデックスを付けます。4) カーネルが終了した後、GPU から CPU への memcpy を実行します。

于 2012-09-20T13:05:31.640 に答える