CUDA全局函数中的本地指针数组

时间:2012-04-01 22:09:46

标签: c++ cuda

我是CUDA的新手。有人可以解释一下,为什么这段代码无效?我正试图在GT240显卡上运行它,内存检查器在buf [0] [0]上显示了一个访问冲突错误。

以下是代码:

__global__ void addKernel(char *c)
{
    int i = threadIdx.x;

    if(i < 1) {
        char* buf[2];
        char some[3] = "ab";
        char another[3] = "cd";

        buf[0] = some;
        buf[1] = another;

        c[i] = buf[0][0];
    }
}

感谢。

更新: 在一个函数中计算某些东西并将结果传递给其他函数的可能解决方案是将数据存储在全局内存(1.x计算)中,如下所示:

__device__ char* buf[2];
__device__ char some[3];
__device__ char another[3];

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;

    if(i < 1) {
        some[0] = 'a';
        some[1] = 'b';

        another[0] = 'c';
        another[1] = 'd';

        buf[0] = some;
        buf[1] = another;

        buf[0][0] = 'b';
        c[i] = 1;
        }
}

2 个答案:

答案 0 :(得分:1)

对我来说看起来不错,当我在调试器的Linux桌面上运行它时工作正常。

建议是;

  1. char * c指向无效的地址,或
  2. 您使用的编译器中的一些奇怪的编译器错误无法初始化char some[3] - 尝试在更简单的赋值语句中将其分解,或者
  3. threadIdx.x否定的可能性?即如果threadIdx.x为-1则c [i]为c [-1],这可能无效......

答案 1 :(得分:1)

这是典型的dangling pointer问题,因为在GT240上,buff将存储在寄存器或本地存储器中,c存储在全局存储器中。指针在计算机1.x设备中不可移植。

您尝试做的事情在您的编程模型/硬件中至少有两种不同的方式是非法的,并且永远无法工作。