c++ - CUDA "Unknown error"原因不明

标签 c++ c visual-studio-2010 cuda nvidia

在我当前的项目中,调用 cudaGetLastError()正在返回unknown error我不知道为什么。代码编译得很好,但它的行为并不像我希望的那样。

下面是一个简短的、无法编译的相关代码的示例:

CU_Main.cu

下面是 CUDA 内核:

//My CUDA kernel
__global__ void CU_KernelTest(Kernel* matrix){
    int idx = blockIdx.x * blockDim.x + threadIdx.x;  
    int idy = blockIdx.y * blockDim.y + threadIdx.y;  

    if(idx == 0 && idy == 0){
            printf("ID is: %d\n", idx);
            matrix->set(1,1, 16.0f);
    }
}

这是主机代码:

//A host function which is called when a button is clicked
int HOST_OnbuttonClick(){
    Kernel* matrix = new Kernel(3,3,2);
    Kernel* device_matrix;

    cudaMalloc(&device_matrix, sizeof(Kernel));
    cudaMemcpy(device_matrix, matrix, sizeof(Kernel), cudaMemcpyHostToDevice);

    CU_KernelTest<<<256, 256>>>(device_matrix);
    cudaDeviceSynchronize();

    cudaError_t err = cudaGetLastError();
    if (err != cudaSuccess) {
        printf("Error: %s\n", cudaGetErrorString(err));
    }


    cudaFree(device_matrix);
    return 0.0f;
}

何时 matrix->set(1,1, 16.0f);包含在 cuda 内核中,(err != cudaSuccess)返回 true 并打印出 UNKNOWN ERROR ,而如果我评论 set出来,我没有收到任何错误。

其他struct与此相关的是我自己的卷积核设计助手,自然称为 Kernel .

内核.cuh

struct Kernel {
    private :
        float* kernel;
        int rows;
        int columns;

    public :

        __device__ __host__
        Kernel(int _rows, int _columns, float _default) {
            rows = _rows;
            columns = _columns;
            kernel = new float[rows * columns];

            for(int r = 0; r < rows; r++){
                for(int c = 0; c < columns; c++){
                    kernel[r * rows + c] = _default;
                }
            }
        }

        __device__ __host__
        void set(int row, int col, float value){
            kernel[row * rows + col] = value;
        }
}

此设计的目标是能够在主机上设置内核的所有值,将其发送到 CUDA 内核,在那里设置值,然后在主机上检索更新的对象。

所以,确实有两个问题,为什么我会得到 unknown error消息,代码在语法上是否正确并且可以正常工作? 如果需要更多信息,请告诉我。

以下是内存检查器的结果:

Nsight Debug
================================================================================
CUDA Memory Checker detected 1 threads caused an access violation:
Launch Parameters
    CUcontext    = 071c7340
    CUstream     = 08f3e3b8
    CUmodule     = 08fa97a8
    CUfunction   = 08fdbbe8
    FunctionName = _Z13CU_KernelTestP6Kernel
    gridDim      = {1,1,1}
    blockDim     = {256,1,1}
    sharedSize   = 128
    Parameters:
        matrix = 0x06b60000  {kernel = 0x07a31718  ???, rows = 3, columns = 3}
    Parameters (raw):
         0x06b60000
GPU State:
   Address  Size      Type  Mem       Block  Thread         blockIdx  threadIdx      PC  Source
-----------------------------------------------------------------------------------------------
  07a31728     4    adr st    g           0       0          {0,0,0}    {0,0,0}  000260  c:\users

Summary of access violations:
c:\users....kernel.cuh(26): error MemoryChecker: #misaligned=0  #invalidAddress=2

最佳答案

您的Kernel类包含一个指针。当您将类复制到设备时,设备上就有一个主机指针。在设备上取消引用它会导致无效地址访问冲突。

这似乎是造成困惑的常见原因。罗伯特·克罗维拉刚刚 explained it昨天。

关于c++ - CUDA "Unknown error"原因不明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16045555/

相关文章:

C++ 将映射传递到 qml 以确定项目的可见性

c++ - 打包可变参数模板具有零元素时的递归

c++ - 封装迭代器提供的对象

C结构填充

C++ - 写入 VS2010 中的特定输出窗口 Pane

c++ - boost::deadline_timer::async_wait 不是异步的

c - fprintf(long) 写入 8 个字节,而 fscanf(long) 读取 6 个字节,为什么?

c++ - 给优化器更大的 "License"

visual-studio-2010 - 值不能为空

windows - Visual C++ 可执行文件和缺少 MSVCR100d.dll