【发布时间】:2014-10-11 00:58:42
【问题描述】:
当将缓冲区作为参数传递给 OpenCL 内核时,内核代码看到的缓冲区地址对于同一个缓冲区是否保持相同?
我用下面的代码检查了一下,地址确实是一样的。但是,我在标准中找不到任何东西来保证这一点。
import pyopencl as cl
import numpy as np
def main():
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
buf = cl.Buffer(ctx, mf.READ_ONLY, 1000)
buf2 = cl.Buffer(ctx, mf.READ_WRITE, 8)
prg = cl.Program(ctx, """
__kernel void
get_addr(__global const int *in, __global long *out)
{
*out = (long)in;
}
""").build()
knl = prg.get_addr
knl.set_args(buf, buf2)
cl.enqueue_task(queue, knl)
b = np.empty([1], dtype=np.int64)
cl.enqueue_copy(queue, b, buf2).wait()
print(b[0])
prg = cl.Program(ctx, """
__kernel void
get_addr(__global const int *in, __global long *out)
{
*out = (long)in;
}
""").build()
knl = prg.get_addr
knl.set_args(buf, buf2)
cl.enqueue_task(queue, knl)
b = np.empty([1], dtype=np.int64)
cl.enqueue_copy(queue, b, buf2).wait()
print(b[0])
if __name__ == '__main__':
main()
用例是我正在使用具有许多(数组)参数的 OpenCL 运行模拟。为了不必将这些数组作为参数传递,我将它们填充到一个结构中,并将指针传递给该结构。由于这个结构将被多次使用(并且被所有工作项)我不想在每个内核的每次运行中都填充它,并且想知道指针是否会在不同的运行/工作项之间发生变化。
【问题讨论】: