2012-04-22 3 views
1

Je suis nouveau à CUDA C. J'écris un simple tableau Ajouter et réduire, quand il exécute la vérification d'erreur pour la copie de l'appareil à l'hôte, je reçois une "erreur inconnue". Je ne sais pas si le vérificateur d'erreur est défectueux et ne pas retourner le cudaError correct, mais je ne peux pas travailler ce qui est faux .......cudaGetLastError renvoie "erreur inconnue"

using namespace std; 


#include <iostream> 

void CudaAddReduce(int *input, int *output, size_t size); 

__global__ void Fill(int *fillItem); 

__global__ void Add(int *input1, int *result); 

__global__ void Reduce(int *intputArray, int *outputArray); 



main(int argc, char *argv[]) 
{ 
const int N = 100; 
int inp[N]; 
int outp[N]; 
size_t size = (N * sizeof(int)); 

CudaAddReduce(inp,outp,size); 

cout << outp[N] << endl; 

} 

void CudaAddReduce(int *input, int *output, size_t size) 
{ 

// allocate buffers to device 

//input 
int *d_input; 
if (cudaMalloc(&d_input,size) != cudaSuccess){ 
    cerr << cudaGetErrorString(cudaGetLastError()) << endl; 
    cout << "Input allocation to device" << endl; 
    exit(1); 
} 
//////////////////////////// 
//output 
int *d_output; 
if (cudaMalloc(&d_output,size) != cudaSuccess){ 
    cerr << cudaGetErrorString(cudaGetLastError()) <<endl; 
    cout << "output allocation to device" << endl; 
    exit(1); 
} 

////////////////////////////////// 
//copy buffers to device from host 
////////////////////////////////// 
//input 
if (cudaMemcpy(d_input, input, size, cudaMemcpyHostToDevice) != cudaSuccess){ 
    cerr << cudaGetErrorString(cudaGetLastError()) << endl; 
    cout << "Input Copy from host to device" << endl; 
    exit(1); 
} 

///////////////////////////////// 
//execute device kernals 
///////////////////////////////// 
int numThreads = 256; 
int numBlocks = 1; 

//Fill Kernal 
Fill<<<numBlocks,numThreads>>>(d_input); 



// Add Kernal 
Add<<<numBlocks,numThreads>>>(d_input,d_output); 


//execute Reduce Kernal 
Reduce<<<numBlocks,numThreads>>>(d_output,d_input); 

cudaThreadSynchronize(); 

///////////////////////////////// 
//copy result from device to host 
///////////////////////////////// 
//output 


if (cudaMemcpy(output,d_output,size,cudaMemcpyDeviceToHost)!= cudaSuccess){ 
    cerr << cudaGetErrorString(cudaGetLastError()) << endl; 
    cout << "Output Copy from device to host" << endl; 
    exit(1); 
} 

//clear device buffers 
cudaFree(d_input); 
cudaFree(d_output); 
} 

__global__ void Fill(int *fillItem) 
{ 
int id = blockIdx.x * blockDim.x + threadIdx.x; 
fillItem[id] = 1; 
} 
__global__ void Add (int *input1, int* result) 
{ 
int id = blockIdx.x * blockDim.x + threadIdx.x; 
result[id] = input1[id] + input1[id]; 
} 
__global__ void Reduce(int *inputArray, int *outputArray) 
{ 
extern __shared__ int sdata[]; 

// each thread loads one element from global to shared mem 
unsigned int tid = threadIdx.x; 
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x; 
sdata[tid] = inputArray[i]; 
__syncthreads(); 

// do reduction in shared mem 
for(unsigned int s=1; s < blockDim.x; s *= 2) 
{ 
    if(tid % (2*s) == 0) 
    { 
     sdata[tid] += sdata[tid + s]; 
    } 
__syncthreads(); 
} 


// write result for this block to global mem 
if(tid == 0) outputArray[blockIdx.x] = sdata[0]; 
} 

Merci

+0

Où commencer ... Chaque noyau contient en dehors des limites des opérations de mémoire, le noyau ne dispose pas de réduire la taille d'une mémoire partagée argument noyau, et la '' cout' dans votre main' contient en dehors des limites accès à la mémoire. – talonmies

+4

Je ne pense pas qu'une question devrait être rejetée simplement parce que le demandeur a écrit un mauvais code. La question est légitime (et elle a même attiré une réponse légitime: elle ne mériterait peut-être aucun vote, mais ne le votera pas.) – harrism

+1

Je suis d'accord avec le harrisme, bien que la vie puisse être facilitée par l'erreur bing rebaptisée YouveDoneSomethingStupidWithMemoryError, – 3Pi

Répondre

4

EDIT: Dans vos kernals , vous essayez d'accéder à des éléments de tableau hors des limites! La taille de votre tableau est 100, mais vous utilisez une dimension de thread de 256, dont chacun essaie d'écrire à cela! Vous devez utiliser des tailles cohérentes.

À quel moment rencontrez-vous l'erreur? Les deux fonctions malloc semblent fonctionner correctement et il est peu probable que cudaGetErrorString soit incorrect. Mon expérience typique avec une erreur inconnue est que vous essayez de copier depuis ou vers quelque chose que vous ne devriez pas, ou avec la mauvaise taille. Pourquoi copiez-vous une matrice non affectée dans la mémoire? Vous n'avez jamais rempli les tableaux dans le principal. De plus, vous n'avez pas besoin de déclarer les fonctions kernal avec < < < >>>. Ceux-ci ne sont nécessaires que lorsque vous utilisez la fonction.

+0

Merci, résolu le problème. Utilise tes recommandations et lance le kernal de la mémoire partagée avec <<< numBlocks, numThreads, SizeOfSharedMemory >>> – Igoren

0

J'ai rencontré cette erreur, et il s'est avéré être ma version du système d'exploitation. Il y avait une discordance avec l'une des bibliothèques dépendantes. Une fois que j'ai mis à jour le système d'exploitation, puis réinstallé les pilotes, cette erreur est parti.

--John