Я написал небольшую 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");
}