【问题标题】:Getting started with shared memory on PyCUDAPyCUDA 上的共享内存入门
【发布时间】:2015-08-22 04:39:54
【问题描述】:

我正在尝试通过使用以下代码来理解共享内存:

import pycuda.driver as drv
import pycuda.tools
import pycuda.autoinit
import numpy
from pycuda.compiler import SourceModule

src='''
__global__ void reduce0(float *g_idata, float *g_odata) {
extern __shared__ float 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];
}
'''

mod = SourceModule(src)
reduce0=mod.get_function('reduce0')

a = numpy.random.randn(400).astype(numpy.float32)

dest = numpy.zeros_like(a)
reduce0(drv.In(a),drv.Out(dest),block=(400,1,1))

我看不出这有什么明显的问题,但我不断收到同步错误并且它没有运行。

非常感谢任何帮助。

【问题讨论】:

  • 您没有为内核启动指定共享内存大小。
  • 原来是 extern shared float sdata[];是nvcc编译器需要的方式。
  • 是的,但是当内核使用动态分配的共享内存时,您必须将共享内存分配大小(以字节为单位)作为内核启动参数传递。您发布的代码没有这样做。

标签: python cuda gpgpu pycuda pyopencl


【解决方案1】:

当你指定时

extern __shared__ float sdata[];

您是在告诉编译器调用者将提供共享内存。在 PyCUDA 中,这是通过在调用 CUDA 函数的行上指定 shared=nnnn 来完成的。在您的情况下,类似于:

reduce0(drv.In(a),drv.Out(dest),block=(400,1,1),shared=4*400)

或者,您可以删除 extern 关键字,并直接指定共享内存:

__shared__ float sdata[400];

【讨论】:

  • 实际上,我不得不同时删除 extern 关键字并使用 shared= 参数来使其工作。
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2012-11-30
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多