2010-08-22 69 views
2

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

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

我在Mac上的两个平台上使用CUDA 3.1,但是我必须将它编译为32位,因为64位CUDA尚未支持。 Linux机器是x64和Ubuntu 10.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或特斯拉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"); 
} 
+0

由于不是具体位置使得它很难回答,我想主要就是有没有人遇到过类似的问题呢? – Nils 2010-08-22 15:29:22

+0

通常会发生,你认为是正确的代码真的是越野车。 AFAIK Mac有一些内存对齐限制,可能会影响你的内存布局。 你能发表部分代码吗? – fabrizioM 2010-08-23 02:18:34

+0

Ditto fabrizioM的评论,请张贴您正在使用的代码! – Tom 2010-08-23 11:35:57

回答

5

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

float *ptr; 
testFunc(ptr); 

你可以做以下代替:

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

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

错过了,谢谢! – Nils 2010-08-24 13:37:25