【问题标题】:CUDA different results on different platformsCUDA在不同平台上的不同结果
【发布时间】:2012-12-17 09:17:06
【问题描述】:

我在我的 macbook pro 上编写了一个小型 CUDA 程序,现在在我的 Linux 机器上试用它并得到不同的结果。

为了确保正确性,我编写了单元测试:包含要检查的值的浮点数组被复制到设备然后返回。最糟糕的是,它有时会在 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 或 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");
}

【问题讨论】:

  • 这里不具体,很难回答,我最想知道的是有没有人遇到过类似的问题?
  • 通常发生在你认为正确的代码实际上是错误的。 AFAIK Mac 有一些内存对齐限制,可能会影响您的内存布局。能贴出部分代码吗?
  • 同上 fabrizioM 的评论,请发布您正在使用的代码!
  • 将尝试复制它,然后发布示例..

标签: cuda


【解决方案1】:

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

float *ptr;
testFunc(ptr);

您可以改为执行以下操作:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2023-03-07
    • 2023-04-02
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多