0

私はCUDAを初めて使用します。行列の乗算を行うカーネルがあります。私には問題ないようですが、失敗する場合もあります。問題がどこにあるか私を助けてください。

__global__ void matrixMultiply(float * A, float * B, float * C,
        int numARows, int numAColumns,
        int numBRows, int numBColumns,
        int numCRows, int numCColumns) 
{
    //@@ Insert code to implement matrix multiplication here

    int Row = blockIdx.y * blockDim.y + threadIdx.y;
    int Col = blockIdx.x * blockDim.x + threadIdx.x;
    if (numAColumns != numBRows) return;

    if ((Row < numARows) && (Col < numBColumns)){
        float Cvalue = 0;

        for (int k = 0 ; k < numAColumns ; ++k )
            Cvalue += A[Row*numAColumns + k] * B[k * numBColumns + Col];

        C[Row*numCColumns + Col] = Cvalue;
        __syncthreads();
    }
}

私は次のようにカーネルを呼び出しています。

int BLOCKX = (int)(ceil((numCRows / 8.0)));
int BLOCKY = (int)(ceil((numCColumns / 8.0)));
printf("Number of blocks: %d\t%d\n", BLOCKX, BLOCKY);
dim3 DimGrid(BLOCKX, BLOCKY);
dim3 DimBlock(8 , 8, 1);
4

1 に答える 1

1

あなたのコードは以下でデッドロックします:

  if ((Row < numARows) && (Col < numBColumns)){
            float Cvalue = 0;

            for (int k = 0 ; k < numAColumns ; ++k )
                Cvalue += A[Row*numAColumns + k] * B[k * numBColumns + Col];

            C[Row*numCColumns + Col] = Cvalue;
            __syncthreads();
        }

一部のスレッドでは条件が満たされ、一部のスレッドでは満たされていないブロックを考えてみましょう。その場合、これはデッドロックになります。条件__syncthreads()外に置くif

dim3 DimGrid(BLOCKX, BLOCKY);にも置き換えdim3 DimGrid(BLOCKY, BLOCKX);ます。それはそれを修正する必要があります

于 2012-12-21T19:27:27.550 に答える