0

これは、いくつかの配列を並行して計算するために起動しているカーネルです。

 __device__ bool mult(int colsize,int rowsize,int *Aj,int *Bi,int *val)
    {       
        for(int j = 0; j < rowsize;j++)
        {           
           for(int k = 0;k < colsize;k++)
            {   
              if(Aj[j] == Bi[k])
               {    
                return true;
                }                               
            }           
        }
            return false;       
    }


__global__ void kernel(int *Aptr,int *Aj,int *Bptr,int *Bi,int rows,int cols,int *Cjc)
    {
        int tid = threadIdx.x + blockIdx.x * blockDim.x;
        int i;
        if(tid < cols)
        {
            int beg = Bptr[tid];
            int end = Bptr[tid+1];
            for(i = 0;i < rows;i++)
            {
                int cbeg = Aptr[i];
                int cend = Aptr[i+1];
                if(mult(end - beg,cend - cbeg,Aj+cbeg,Bi+beg))
                {                                                
                     Cjc[tid+1] += 1;
                     //atomicAdd(Cjc+tid+1,1);           
                }
            }                
        }               
    }

そして、これがグリッドとブロックの構成を決定する方法です

int numBlocks,numThreads;

        if(q % 32 == 0)
        {
            numBlocks = q/32;
            numThreads = 32;
        }
        else
        {
            numBlocks = (q+31)/32;
            numThreads = 32;
        }
findkernel<<<numBlocks,numThreads>>>(devAptr,devAcol,devBjc,devBir,m,q,d_Cjc);

CC 2.0 で GTX 480 を使用しています。今私が直面している問題は、配列内の値をq超えて増加するたびに、すべてとして生成されることです。X 方向に使用できるブロックの最大数は であり、各ブロックは最大でスレッドを持つことができることを知っています。では、なぜこのカーネルは配列に対して間違った出力を計算するのでしょうか?4096Cjc065535(1024,1024,64)Cjc

4

2 に答える 2

0

あなたが投稿したコードにはいくつか問題があるようです:

  1. 上記のCUDAコードにあるfindkernelと思いますか?kernel
  2. kernelには 8 つのパラメーターがありますが、7 つのパラメーターのみを使用して を呼び出しますfindkernel。これは正しくありません。
  3. ではkernel、テストしますif(tid < cols)- これはif(tid < count)??
  4. がポインタであることをkernel期待するのはなぜですか? へのポインタではなく、通常の整数値をcount渡すと思います。intfindkernel
  5. 使用されていない場合、なぜ__device__ bool mult取得するのですcountint *val?

#3または#4が問題の原因である可能性があると思いますが、他のことも確認する必要があります.

于 2012-08-07T09:14:09.080 に答える
0

わかりましたので、デバイスからホストへ の配列cudaError_tを試みたときに、それを使用して最終的に理解しました。次のエラーがスローされます。cudaMemcpyd_Cjc

CUDA error: the launch timed out and was terminated

OS の「ウォッチドッグ」の時間制限により、一部の計算にfindkernelかなりの時間がかかり、ディスプレイ ドライバがプログラムを終了させて​​いることがわかりました。

Xサーバーをシャットダウンするか、gpuマシンのディスプレイを削除して(別のマシンから)sshする必要があると思います。これにより、OSの「ウォッチドッグ」制限を超えない計算を行う時間が稼げます。

于 2012-08-07T20:50:27.563 に答える