【问题标题】:PyOpenCL: how to create a local memory buffer?PyOpenCL:如何创建本地内存缓冲区?
【发布时间】:2015-05-16 03:49:50
【问题描述】:

这里可能是非常简单的问题,但我已经搜索了好几个小时,但没有任何可显示的内容。

我有这段代码,我想要一个 256 位 (8 uint32) bitstring_gpu 作为设备中的本地内存指针:

def Get_Bitstring_GPU_Buffer(ctx, bitstring):
    bitstring_gpu = cl.Buffer(ctx, mem_flags.READ_ONLY | mem_flags.COPY_HOST_PTR, hostbuf=bitstring)
return bitstring_gpu

这稍后会在内核调用中使用:

prg.get_active_hard_locations_64bit(queue, (HARD_LOCATIONS,), None, memory_addresses_gpu.data, bitstring_gpu, distances_gpu.data, hash_table_gpu.data ).wait()

...而位串只是一个随机的 256 位位串(通过 sha256 生成,然后转换为一个 numpy 数组。

def Get_Random_Bitstring():    
    bitstring = address_space_through_sha256_SDM.get_bitstring(str(random.randrange(2**32-1)))
return bitstring

如何让 bitstring_buf 进入快速的本地内存?

相关但不同的问题;这里缓冲区正在内核内部创建...

How to create variable sized __local memory in pyopencl?

【问题讨论】:

标签: python-2.7 opencl pyopencl


【解决方案1】:

我可能误解了这个问题,但是如果您希望将数组放置在本地内存中 - 您完全可以在内核中执行此操作。负责分配和复制到本地内存的是您的 OpenCL 代码,而不是您的 Python 代码。

例如,这个 OpenCL 代码 - 在内核中 - 将创建一个包含 8 个本地 uint 的数组,并将一个 uint 从全局内存复制到新的本地数组中。

__local uint my_local_array[8];

my_local_array[0] = my_global_array[0];

当您希望从本地内存中返回结果时,您可以从本地复制到全局,然后从全局复制回主机。

希望有帮助!

【讨论】:

  • 我的印象是您可以将缓冲区作为 __local;所以,我的想法错了吗?
  • 仅当本地内存量在编译时未知并因此动态分配时,才需要将__local 参数传递给内核。
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多