#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <stdlib.h>
#define NUMBEROFMX 256*64
__global__ void reduce0(int *g_idata, int *g_odata)
{
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
for (unsigned int s = 1; s < blockDim.x; s *= 2)
{
if (tid % (2 * s) == 0)
{
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
if (tid == 0)
{
g_odata[blockIdx.x] = sdata[0];
}
}
int main()
{
int *A;
int *B;
int *dev_A;
int *dev_B;
A = (int*)malloc(sizeof(int) * NUMBEROFMX);
B = (int*)malloc(sizeof(int) * NUMBEROFMX);
cudaMalloc((void**)&dev_A, sizeof(int)*NUMBEROFMX);
cudaMalloc((void**)&dev_B, sizeof(int)*NUMBEROFMX);
for (int i = 0; i < NUMBEROFMX; i++)
{
A[i] = 1;
}
cudaMemcpy(dev_A, A, sizeof(int)*NUMBEROFMX, cudaMemcpyHostToDevice);
reduce0 << <256, 64 >> >(dev_A, dev_B);
cudaMemcpy(B, dev_B, sizeof(int)*NUMBEROFMX, cudaMemcpyDeviceToHost);
printf("%d\n", B[0]);
}
我研究CUDA编程。这段代码没有完成,但是我想用树减少的数组总和来编写代码。我希望在B [0]中获得64但是B [0]的值无效。 当我使用NSIGHT调试此代码时,g_odata [0]为64.但是B [0]无效。我不知道为什么。
答案 0 :(得分:2)
如果您使用proper CUDA error checking或使用cuda-memcheck
运行代码,则会发现非法使用共享内存(超出范围的共享或本地地址)。
对于您尝试使用的动态共享内存,您需要在内核调用中指定每个块的共享内存大小:
reduce0<<<256, 64, 64*sizeof(int)>>>(dev_A, dev_B);
通过此更改,您的内核可以按预期工作。
有关共享内存的更多背景信息,请参阅博文Using Shared Memory in CUDA C/C++。