Arrays CUDA阵列缩减

Arrays CUDA阵列缩减,arrays,vector,cuda,reduction,Arrays,Vector,Cuda,Reduction,我知道有很多类似的问题已经得到了回答,但我无法从他们那里拼凑出任何非常有用的东西,除了我可能错误地索引了一些东西 我试图将输入向量a上的顺序寻址简化为输出向量B 此处提供了完整的代码,但这是内核: __global__ void vectorSum(int *A, int *B, int numElements) { extern __shared__ int S[]; // Each thread loads one element from global to shared memo

我知道有很多类似的问题已经得到了回答,但我无法从他们那里拼凑出任何非常有用的东西,除了我可能错误地索引了一些东西

我试图将输入向量a上的顺序寻址简化为输出向量B

此处提供了完整的代码,但这是内核:

__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];
  }
}
全局无效向量和(int*A,int*B,int numElements){
外部共享内部S[];
//每个线程从全局内存加载一个元素到共享内存
int tid=threadIdx.x;
int i=blockDim.x*blockIdx.x+threadIdx.x;
如果(i0;t>>=1){
如果(tid
以下是内核启动声明:

// Launch the Vector Summation CUDA Kernel
  int threadsPerBlock = 256;
  int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
  vectorSum<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, numElements);
//启动向量求和CUDA内核
int threadsPerBlock=256;
int blocksPerGrid=(numElements+threadsPerBlock-1)/threadsPerBlock;
向量和(d_A,d_B,numElements);

我得到了一个未指明的启动错误,我读到它类似于segfault。我一直密切关注英伟达的还原文档,并试图将内核保持在NUMLIST的范围内,但是考虑到代码的简单性,我似乎缺少了一些关键。

< P>您的问题是,还原内核需要动态分配的共享内存才能正确操作,但是您的内核启动没有指定任何。结果是越界/非法共享内存访问导致内核中止

在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);
//启动向量求和CUDA内核
int threadsPerBlock=256;
int blocksPerGrid=(numElements+threadsPerBlock-1)/threadsPerBlock;
size_t shmsz=(size_t)threadsPerBlock*sizeof(int);
向量和(d_A,d_B,numElements);
[免责声明:在浏览器中编写的代码,未经编译或测试,使用风险自负]


这至少可以解决代码中最明显的问题。

您的问题是精简内核需要动态分配的共享内存才能正确运行,但您的内核启动没有指定任何共享内存。结果是越界/非法共享内存访问导致内核中止

在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);
//启动向量求和CUDA内核
int threadsPerBlock=256;
int blocksPerGrid=(numElements+threadsPerBlock-1)/threadsPerBlock;
size_t shmsz=(size_t)threadsPerBlock*sizeof(int);
向量和(d_A,d_B,numElements);
[免责声明:在浏览器中编写的代码,未经编译或测试,使用风险自负]


这至少可以解决代码中最明显的问题。

请不要在pastebin中发布代码。将相关代码放在问题中。此外,您可能对在中找到的代码感兴趣-这将大大简化本例中的主机代码。请不要在pastebin中发布代码。把相关的代码放在问题中。另外,您可能对在中找到的代码感兴趣-在本例中,这将大大简化您的主机代码。