1

奇妙な問題があります。次のコードがあります。最初の関数を呼び出すと、正しい結果が得られません。ただし、function2 (2 番目の関数) を呼び出すと、正常に動作します。私にはとても奇妙です。誰でも問題について何か考えがありますか? ありがとう!!!

__global__ void function(int w, class<double> C, float *result) {  

    int r = threadIdx.x + blockIdx.x * blockDim.x;  
    int c = threadIdx.y + blockIdx.y * blockDim.y;  
    int half_w = w /2;  

    if (r < w && c < w) {  
        double dis = sort((double)(r - half_w) * (r - half_w) + (double)(c_half_w) * (c - half_w));  
    result[c * w + r] = (float)C.getVal(dis);  
    }  
}


__global__ void function2(int w, class<double> C, float *result) {  

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

    int half_w = w /2;
    int r = tid / w;  
    int c = tid % w;    

    if (r < w && c < w) {  
        double dis = sort((double)(r - half_w) * (r - half_w) + (double)(c_half_w) * (c - half_w));  
    result[c * w + r] = (float)C.getVal(dis);  
    }  
}

更新: と を使用しfunctionfunction2画像を描画します。ピクセル値は、画像の中心と現在のピクセル位置の間の距離に基づいています。距離に基づいて、クラス C の getVal がピクセルの値を計算します。そのため、カーネルでは、距離と対応するピクセル値を計算するすべてのスレッドを作成するだけです。正しい結果は、CPU バージョンと比較されます。ランダムな値を与えるだけで、function非常に大きいものと非常に小さいものがあります。を に変更しresult[c * w + r] = (float)C.getVal(dis)result[c * w +r ] = 1.0fも、生成される画像は変わらないようです。

画像サイズはW×W、起動するfunctionI設定 dim3 grid_dim(w / 64 + 1, w / 64 + 1); dim3 block_dim(64, 64); function<<<grid_dim, block_dim>>>(W, C, cu_img);

打ち上げへfunction2 function2<<<W / 128 + 1, 128>>>(W, C, cu_img)

修理済み:

問題が発生しました。1 つのブロックに割り当てたスレッドが多すぎます。私のデバイスでは、1 ブロックの最大スレッド数は 1024 です。実際、cuds-memcheck を実行すると、function2起動すらしていないことがわかります。

4

1 に答える 1

1

私は問題を解決しました。1つのブロックに割り当てたスレッドが多すぎます。私のデバイスでは、1つのブロックの最大スレッド数は1024です。実際、cuda-memcheckを実行したとき、function2これまで起動されていなかったことがわかります。

于 2013-01-19T17:06:39.670 に答える