代码之家  ›  专栏  ›  技术社区  ›  Nils

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

  •  2
  • Nils  · 技术社区  · 14 年前

    我在我的MacBookPro上写了一个小的CUDA程序,现在在我的Linux机器上试用,得到了不同的结果。

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

    我在mac上的两个平台上都使用CUDA3.1,但是我必须编译它32位,因为64位CUDA还不受支持。Linux机器是x64和Ubuntu10.04(gcc是4.3.4),Mac上的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 回复  |  直到 14 年前
        1
  •  5
  •   Bill Lynch    12 年前

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

    float *ptr;
    testFunc(ptr);
    

    __device__ void testFunc(float &val)
    {
        val = 3.4;
    }
    
    ...
            float val;
            testFunc(&val);
            validation_data[0] = val;
    ...