2010-08-22 7 views
2

Я написал небольшую программу CUDA на моем macbook pro и теперь попробовал ее на своем Linux-боксе и получил разные результаты.CUDA разные результаты на разных платформах

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

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

Графические процессоры находятся на Mac GeForce 9600M GT (Compute возможностей 1,1) и на PC GeForce GTX 285 или (способность Compute 1,3) Telsa C1060

Я сделал несколько больше проверки и обеспечить, чтобы данные читаются полностью, но до сих пор я не мог идентифицировать проблему с любыми идеями, как выяснить, что вызывает проблемы?

Обновление Я не смог воспроизвести все, но этот пример иногда печатает только нули, а иногда и правильные результаты .. почему?

#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

не специфичен здесь делает его трудно ответить на то, что мне интересно, в основном, есть еще кто-нибудь сталкивались с подобными проблемами? – Nils

+0

обычно бывает, что код, который, по вашему мнению, прав, действительно глючит. AFAIK Mac имеет некоторые ограничения выравнивания памяти, которые могут повлиять на макет памяти. Можете ли вы разместить часть кода? – fabrizioM

+0

Комментарий Ditto fabrizioM, пожалуйста, напишите код, который вы используете! – Tom

ответ

5

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

float *ptr; 
testFunc(ptr); 

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

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

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

Пропустил это, спасибо! – Nils

Смежные вопросы