我在我的 MacBook Pro 上编写了一个小型 CUDA 程序,现在在我的 Linux 机器上进行了尝试,并得到了不同的结果。
为了确保正确性,我编写了单元测试:将包含要检查的值的 float 组复制到设备,然后复制回来。最糟糕的是,它有时在 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");
}
最佳答案
这是未定义的行为。您正在取消引用未定义的指针。
float *ptr;
testFunc(ptr);
您可以执行以下操作:
__device__ void testFunc(float &val)
{
val = 3.4;
}
...
float val;
testFunc(&val);
validation_data[0] = val;
...
关于CUDA在不同平台上的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541545/