我知道有许多类似于这个问题的问题已经被解答了,但是我无法拼凑出来自它们的任何非常有用的东西,除了我可能是错误地索引了什么。
我试图将输入向量A上的顺序寻址简化为输出向量B。
完整的代码在这里是可用的http://pastebin.com/7UGadgjX,但这是内核:
__global__ void vectorSum(int *A, int *B, int numElements) {
extern __shared__ int S[];
// Each thread loads one element from global to shared memory
int tid = threadIdx.x;
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements) {
S[tid] = A[i];
__syncthreads();
// Reduce in shared memory
for (int t = blockDim.x/2; t > 0; t>>=1) {
if (tid < t) {
S[tid] += S[tid + t];
}
__syncthreads();
}
if (tid == 0) B[blockIdx.x] = S[0];
}
}
以下是内核启动语句:
// Launch the Vector Summation CUDA Kernel
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorSum<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, numElements);
我得到了一个未指定的启动错误,我已经读到类似于分段错误。我一直在密切关注nvidia裁减文档,并试图将内核保持在numElements的范围内,但考虑到代码有多简单,我似乎遗漏了一些关键内容。
发布于 2013-06-10 21:46:52
您的问题是,精简内核需要动态分配共享内存才能正确操作,但是内核启动没有指定任何。结果是越界/非法共享内存访问,从而中止内核。
在CUDA运行时API语法中,内核启动语句有四个参数。前两个是发射的网格和块尺寸。后两者是可选的,默认值为零,但指定动态分配的共享内存大小和流。
若要解决此问题,请按以下方式更改启动代码:
// Launch the Vector Summation CUDA Kernel
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
size_t shmsz = (size_t)threadsPerBlock * sizeof(int);
vectorSum<<<blocksPerGrid, threadsPerBlock, shmsz>>>(d_A, d_B, numElements);
免责声明:在浏览器中编写的代码,未经编译或测试,可自行使用。
这至少可以解决代码中最明显的问题。
https://stackoverflow.com/questions/17036934
复制