CUDA地址超出范围

CUDA地址超出范围,c,cuda,gpu,C,Cuda,Gpu,我一直在玩一个简单的CUDA程序,它只是将全局内存归零。以下是设备代码和主机代码: #include <stdio.h> __global__ void kernel(float *data, int width) { int x = blockDim.x * blockIdx.x + threadIdx.x; int y = blockDim.y * blockIdx.y + threadIdx.y; if (x > (width-1)) {

我一直在玩一个简单的CUDA程序,它只是将全局内存归零。以下是设备代码和主机代码:

#include <stdio.h>

__global__ void kernel(float *data, int width) {
    int x = blockDim.x * blockIdx.x + threadIdx.x;
    int y = blockDim.y * blockIdx.y + threadIdx.y;

    if (x > (width-1)) {
        printf("x = %d\n", x);
        printf("blockDim.x = %d\n", blockDim.x);
        printf("blockIdx.x = %d\n", blockIdx.x);
        printf("threadIdx.x = %d\n", threadIdx.x);
    }   

    if (y > (width-1)) {
        printf("y = %d\n", y);
        printf("blockDim.y = %d\n", blockDim.y);
        printf("blockIdx.y = %d\n", blockIdx.y);
        printf("threadIdx.y = %d\n", threadIdx.y);
    }   

    data[y * width + x] = 0.0;
}

int main(void) {
    const int MATRIX_SIZE = 256;
    float *data, *dataGPU;
    int sizeOfMem;
    int x = MATRIX_SIZE;
    int y = MATRIX_SIZE;

    cudaDeviceReset();
    cudaDeviceSynchronize();

    sizeOfMem = sizeof(float) * x * y;

    data = (float *)malloc(sizeOfMem);
    cudaMalloc((void **)&dataGPU, sizeOfMem);

    cudaMemcpy(dataGPU, data, sizeOfMem, cudaMemcpyHostToDevice);

    //int threads = 256;
    //int blocks = ((x * y) + threads - 1) / threads;

    dim3 threads(16, 16);
    dim3 blocks(x / 16, y / 16);

    kernel<<<blocks, threads>>>(dataGPU, MATRIX_SIZE);
    cudaThreadSynchronize();

    cudaMemcpy(data, dataGPU, sizeOfMem, cudaMemcpyDeviceToHost);

    cudaFree(dataGPU);

    free(data);

    return 0;
}
这个输出对我来说没有意义,因为如果我计算

y = blockDim.y * blockIdx.y + threadIdx.y = 16 * 1 + 10 = 26 (not 2074)
我花了一些时间看CUDA编程论坛,但似乎没有任何帮助。我读到的一个线程表明我可能损坏了寄存器内存。然而,开始线程的那一个在另一个GPU上有这个问题。该线程有点不相关,但我还是包含了链接

下面我已经包括了nvcc版本

 nvcc: NVIDIA (R) Cuda compiler driver
 Copyright (c) 2005-2015 NVIDIA Corporation
 Built on Tue_Aug_11_14:27:32_CDT_2015
 Cuda compilation tools, release 7.5, V7.5.17
还有,这是我正在使用的GPU

 Device 0: "GeForce GT 640"
 CUDA Driver Version / Runtime Version 8.0 / 7.5
 CUDA Capability Major/Minor version number: 3.0

有CUDA经验的人能指出我可能做错了什么吗?

这个问题似乎只限于某个特定的系统,并且是由某种硬件问题引起的。代码本身很好,换成另一个系统确认它工作正常


[此答案由评论汇总而成,并作为社区wiki条目添加,以将其问题从CUDA标记的未答复队列中删除]。

您发布的代码对我来说运行正确,并且不会在CUDA memcheck中产生任何错误。如果从SO问题中复制粘贴、编译并运行,您真的确定您发布的代码会出现cuda memcheck错误吗?cudaMalloc成功吗?@RegisPortalez:如果cudaMalloc失败,cuda memcheck会报告错误。发布的输出不包含此类错误。即使
x
和/或
y
超出范围,您的内核也会尝试写入
数据。@Talonmes:是的,对此表示抱歉。我用的GPU好像坏了。我把我的代码扔到另一个GPU上,它工作没有问题。
 Device 0: "GeForce GT 640"
 CUDA Driver Version / Runtime Version 8.0 / 7.5
 CUDA Capability Major/Minor version number: 3.0