我对OpenCL中的__本地内存感到困惑。 我读了一些规范,说数据流必须是从Host到 __Global,然后__Local。 但我也看到了一些像这样的内核函数:
__kernel void foo(__local float * a)
我想知道数据是如何直接传输到__local的 记忆就这样?
感谢。
答案 0 :(得分:4)
无法在主机端填充本地缓冲区。因此,您必须遵循流主机 - > __global - > __local。
可以在主机端创建本地缓冲区,然后将其作为内核参数传递,或者在内核中的gpu端传递。 在主机端创建本地缓冲区有利于在内核运行之前决定其大小,如果每次运行内核时本地缓冲区大小需要不同,这一点很重要。
答案 1 :(得分:2)
除了单个工作组之外的任何东西都看不到本地内存,并且可以分配本地内存,因为工作组由许多体系结构上的硬件调度。可以混合来自每个CU上的不同内核的多个工作组的硬件将允许调度组件为所发布的每个组块化本地存储器。在组启动之前它不存在,并且在组终止后不存在。正如其他答案所指出的那样,这个区域的大小就是你所传递的。
这样做的结果是,许多体系结构从主机填充本地内存的唯一方法是由编译器插入内核代码,以便从全局内存中复制数据。鉴于作为基础,程序员手动执行的性能并没有任何差别,并且可以更准确地控制发生的情况。您最终不会遇到编译器总是生成复制代码并最终复制超过实际需要的情况,因为API没有说清楚什么内存是copy-in和什么不是。
总之,您无法以任何自动方式填充本地内存。实际上你很少想要,因为手动操作让你有机会只将第一阶段的结果放入本地,删除额外的复制操作,或者将数据转换为本地,允许填充或数据转置删除银行冲突等。
答案 2 :(得分:0)
正如@doqtor所说,内核参数的本地内存大小可以通过clSetKernelArg
调用来指定。
幸运的是,OpenCL 1.2+支持VLA(可变长度数组),不再需要本地内存内核参数。