CUDA разные результаты на разных платформах - PullRequest
2 голосов
/ 22 августа 2010

Я написал небольшую CUDA-программу на своем MacBook Pro, а теперь опробовал ее на моем Linux-компьютере и получил разные результаты.

Чтобы убедиться в правильности, я написал модульные тесты: массив с плавающей точкой, который содержит значения для проверки, копируется на устройство и затем обратно.Хуже всего то, что он иногда возвращает разные значения в Linux (и очень странные), но на моем Mac он работает каждый раз правильно.

Я использую CUDA 3.1 на обеих платформах на Mac, однако мне приходится его компилировать32-битная, потому что 64-битная CUDA еще не поддерживается.Linux-машина и x64 с Ubuntu 10.04 (gcc - 4.3.4) на Mac, версия gcc - i686-apple-darwin10-gcc-4.2.1.

Графические процессоры на Mac GeForce 9600M GT(Возможность вычислений 1.1) и на ПК 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");
}

1 Ответ

5 голосов
/ 24 августа 2010

Это неопределенное поведение.Вы разыменовываете неопределенный указатель.

float *ptr;
testFunc(ptr);

Вместо этого вы можете сделать следующее:

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

...
        float val;
        testFunc(&val);
        validation_data[0] = val;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...