Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于OpenCL中的不同内核/程序,缓冲区的设备地址是否相同_Opencl_Pyopencl - Fatal编程技术网

对于OpenCL中的不同内核/程序,缓冲区的设备地址是否相同

对于OpenCL中的不同内核/程序,缓冲区的设备地址是否相同,opencl,pyopencl,Opencl,Pyopencl,当将缓冲区作为参数传递给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

当将缓冲区作为参数传递给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运行一个模拟,它有许多(数组)参数。为了不必将这些数组作为参数传递,我将它们填充到一个结构中,并传递指向该结构的指针。由于此结构将被多次使用(并且被所有工作项使用),我不想在每个内核的每次运行中都填充它,并且想知道指针是否会在不同的运行/工作项之间更改。

OpenCL 1.x不保证使用此结构。这就是为什么在缓冲区中存储指针是不安全的。允许运行时为每次内核启动移动分配。不能保证它会移动缓冲区,当然,可以合理地预期缓冲区不会经常需要移动,因此看到所看到的结果也就不足为奇了。如果您分配了更多的缓冲区并循环使用它们,以迫使运行时移动它们,您将更有可能看到问题


对于OpenCL 2.0,共享虚拟内存功能根据定义保证了这一点:如果地址不断变化,就无法共享。

是的,我意识到OpenCL 2.0中的SVM不应该移动,我只是希望OpenCL 1.x也有类似的保证(可能带有特殊标志)。。。。我想我会在每次运行内核时填充结构。无论如何,这似乎不是性能瓶颈。。。。