2010-08-22 7 views
2

j'ai écrit un petit programme CUDA sur mon macbook pro et maintenant essayé sur ma boîte Linux et obtenir des résultats différents.CUDA des résultats différents sur différentes plates-formes

Afin d'assurer l'exactitude, j'ai écrit les tests unitaires: Un tableau de flotteurs, qui contient les valeurs de vérifier, est copié sur le périphérique, puis en arrière. Le pire est qu'il renvoie parfois des valeurs différentes sur Linux (et très étranges), mais sur mon Mac il fonctionne correctement à chaque fois.

-je utiliser CUDA 3.1 sur les deux plates-formes sur le mac mais je dois compiler 32bit, parce que 64bit CUDA est pas encore pris en charge. La machine Linux est et x64 avec Ubuntu 10.04 (gcc est 4.3.4) sur le Mac la version gcc est i686-apple-darwin10-gcc-4.2.1.

Les GPU sont sur le Mac GeForce 9600M GT (Capability Compute 1.1) et sur la GeForce PC GTX 285 ou une (capacité Compute 1.3) C1060 Telsa

Je l'ai fait un peu plus vérifier et nous avons vérifié que la les données sont lues complètement, mais jusqu'à présent, je ne pouvais pas identifier le problème des idées pour savoir ce qui cause le problème?

Mise à jour je ne pouvais pas tout reproduire, mais cet exemple imprime parfois des zéros seulement et parfois les résultats corrects .. pourquoi?

#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

Ne pas être spécifique ici rend difficile de répondre, ce que je me demande surtout est-Quelqu'un at-il connu des problèmes similaires? – Nils

+0

arrive généralement que le code que vous pensez est correct est vraiment bogué. AFAIK Mac a certaines contraintes d'alignement de la mémoire qui peuvent influencer votre disposition de la mémoire. Pouvez-vous poster une partie du code? – fabrizioM

+0

Ditto fabrizioM's commentaire, s'il vous plaît poster le code que vous utilisez! – Tom

Répondre

5

Ce comportement n'est pas défini. Vous déréférencer un pointeur indéfini.

float *ptr; 
testFunc(ptr); 

Vous pouvez effectuer les opérations suivantes à la place:

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

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

Missed que, merci! – Nils

Questions connexes