我在我的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);
cudaMemcpy(validation_data, validation_data_d, sizeof(float)*n,
cudaMemcpyDeviceToHost);
for(int i=0; i<n; i++)
printf("%f ", validation_data[i]);
printf("\n");
}