从CUDA矩阵乘法核得到错误结果

从CUDA矩阵乘法核得到错误结果,cuda,Cuda,我是CUDA的新手。我有一个做矩阵乘法的内核。这对我来说似乎没问题,但在某些情况下是失败的。请帮我找出问题所在 __global__ void matrixMultiply(float * A, float * B, float * C, int numARows, int numAColumns, int numBRows, int numBColumns, int numCRows, int numCColumns) { //@@ I

我是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();
    }
}

您的代码将在以下情况下死锁:

  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();
        }
if((行
考虑一个块,其中某些线程满足条件,而某些线程不满足条件。在这种情况下,这将导致死锁。将
\uuu syncthreads()
置于
if
条件之外


同时更换
dim3 DimGrid(BLOCKX,BLOCKY)通过
dim3 DimGrid(块Y、块X)。这应该可以解决问题

请以后多注意代码格式。您在内核中有一个完全不必要的
\uuu syncthreads()
调用,它除了破坏内核之外没有任何用途。此外,这些coursera cuda问题越来越重复,我投票决定将其作为一个重复来结束。如果你打算在功课上作弊,至少要检查一下,在你之前没有人在同一个作业上作弊。塔兰米斯,我不是来欺骗自己的。我需要帮助,因为我努力了,却找不到问题所在。感谢您的帮助。
\uu syncthreads()
在这段代码中完全没有任何用处。它应该被消除,而不是移动。对。但死锁点是validI已删除_syncthreads()。但我还是得到了错误的结果。如果矩阵C的高度和宽度相等,则工作正常。例如,在A[34,45]xb[45,34]=C[34,34]的情况下,我得到了正确的结果。但是,如果A[34,45]xb[45,51]=C[34,51],它就失败了。@user1921237:Answer-edited。见最后一部分:)我明白了..非常感谢。。
  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();
        }