カーネル内にシーケンシャル セクションがあり、実際に速度が低下しています。ただし、内側のループを取り除く方法がわかりません。ここに何か提案はありますか?
__global__ void myKernel( int keep, int inc, int width, int* d_Xnum,
int* d_Xco, bool* d_Xvalid,int* d_A )
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
int k1;
if( i < keep && j <= i){
int counter = 0;
for(k1 = 0; k1 < inc; k1++){
if(d_Xvalid[j*inc + k1] == 0)
counter += (d_Xvalid[i*inc + d_Xco[j*width + k1]]);
}
d_A[i*keep+j] = inc - d_Xnum[i] - counter;
}
}
削除k1
することで、コードがかなり高速化されると思います。しかし、私はそれを使用してそれを行う方法がわかりませんcounter
。提案、アイデア、考えは大歓迎です!このカーネルは次のように呼ばれます。
...
int t = 32;
int b = keep/(32)+1;
int b2 = (inc/32)+1;
dim3 thread (t, t);
dim3 block (b, inc);
// kernel call
myKernel<<<block, thread>>>(k, inc, width, d_Xnum,
d_Xco, d_Xvalid, d_A);
cudaThreadSynchronize();
...
keep
約9000とinc
約20000です