Ich habe die Reduktion # 1 aus den bekannten Dias von Mark Harris implementiert, aber ich erhalte 0 als Ergebnis. Ich füllte das Input-Array mit den gleichen Werten wie in den Folien. Ich kompilierte mit cuda 7.0 mit dem Befehl nvcc reduction1.cu -o red1. Wo ist der Fehler? Vielen Dank.Ergebnis der Reduzierung # 1 ist falsch
#include <stdio.h>
#include <cuda_runtime.h>
#define THREADS_PER_BLOCK 16
__global__ void reduce1(int *g_idata, int *g_odata) {
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] = g_idata[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) g_odata[blockIdx.x] = sdata[0];
}
int main()
{
int inputLength=16;
int hostInput[16]={10,1,8,-1,0,-2,3,5,-2,-3,2,7,0,11,0,2};
int hostOutput=0;
int *deviceInput;
int *deviceOutput;
cudaMalloc((void **)&deviceInput, inputLength * sizeof(int));
cudaMalloc((void **)&deviceOutput, sizeof(int));
cudaMemcpy(deviceInput, hostInput, inputLength * sizeof(int),cudaMemcpyHostToDevice);
reduce1<<<1,THREADS_PER_BLOCK>>>(deviceInput, deviceOutput);
cudaDeviceSynchronize();
cudaMemcpy(&hostOutput, deviceOutput,sizeof(int), cudaMemcpyDeviceToHost);
printf("%d\n",hostOutput);
cudaFree(deviceInput);
cudaFree(deviceOutput);
return 0;
}
Sie geben keine Größe für die dynamische Shared-Memory-Zuweisung an. Ich habe speziell erwähnt, wie das in meiner letzten Antwort auf dich funktioniert. Wenn Sie sich mit der Fehlerprüfung abmühen, werden Sie feststellen, dass der Kernel mit einer Speicherzugriffsverletzung versagt. – talonmies
Sie sollten [richtige CUDA-Fehlerprüfung] implementieren (https://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for--rules-using-the-cuda-runtime-api) ** vorher ** andere um Hilfe zu bitten. Es kann Ihnen helfen, das Problem selbst zu verstehen, und selbst wenn Sie es nicht verstehen, wird die Fehlerausgabe für diejenigen nützlich sein, die versuchen, Ihnen zu helfen. –