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
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
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
Je suis d'accord avec le harrisme, bien que la vie puisse être facilitée par l'erreur bing rebaptisée YouveDoneSomethingStupidWithMemoryError, – 3Pi