我已经在我的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");
}
答案 0 :(得分:5)
这是未定义的行为。您正在取消引用未定义的指针。
float *ptr;
testFunc(ptr);
您可以执行以下操作:
__device__ void testFunc(float &val)
{
val = 3.4;
}
...
float val;
testFunc(&val);
validation_data[0] = val;
...