CUDA在不同平台上的结果不同

时间:2010-08-22 12:55:40

标签: cuda

我已经在我的macbook pro上编写了一个小的CUDA程序,现在在我的Linux机器上试用了它并获得了不同的结果。

为了确保正确性,我编写了单元测试:包含要检查的值的浮点数组被复制到设备然后返回。最糟糕的是它有时会在Linux上返回不同的值(而且非常奇怪),但在我的Mac上它每次都运行正确。

我在Mac上的两个平台上使用CUDA 3.1但是我必须将其编译为32位,因为尚不支持64位CUDA。 Linux机器是x64,Mac上的Ubuntu 10.04(gcc是4.3.4),gcc版本是i686-apple-darwin10-gcc-4.2.1。

GPU采用Mac GeForce 9600M GT(计算能力1.1)和PC GeForce GTX 285或Telsa C1060(计算能力1.3)

我已经做了一些检查并确保完全读取数据,但到目前为止我无法确定问题如何找出造成问题的原因?

更新我无法重现所有内容,但此示例有时会打印出零,有时会输出正确的结果..为什么?

#include <stdio.h>

__device__ void testFunc(float *ptr)
{
    *ptr = 3.4;
}

__global__ void testkernel(float* validation_data, int n)
{
    for(int i=0; i<100; i++)
        validation_data[i] = 666;

    float *ptr;
    testFunc(ptr);
    validation_data[0] = *ptr;
}

int main()
{  
    int n = 100;
    float *validation_data = (float*)malloc(sizeof(float)*100);
    float *validation_data_d;

    cudaMalloc((void**)&validation_data_d, sizeof(float)*n);

    testkernel <<<1,1>>> (validation_data_d, n);

    // Copy the array back again.
    cudaMemcpy(validation_data, validation_data_d, sizeof(float)*n,
        cudaMemcpyDeviceToHost);

    for(int i=0; i<n; i++)
        printf("%f ", validation_data[i]);
    printf("\n");
}

1 个答案:

答案 0 :(得分:5)

这是未定义的行为。您正在取消引用未定义的指针。

float *ptr;
testFunc(ptr);

您可以执行以下操作:

__device__ void testFunc(float &val)
{
    val = 3.4;
}

...
        float val;
        testFunc(&val);
        validation_data[0] = val;
...