gpt4 book ai didi

c++ - OpenCL/C++主机代码并发运行和内存维护

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:37 25 4
gpt4 key购买 nike

我正在尝试使用 OpenCL 来加速预先存在的 C++ 模拟的某些部分。目前,我选择了一个在每个模拟时间步上运行 1k-1M 迭代的循环。

根据我目前的理解,在调用内核之前,我必须使用 enqeueWriteBuffer 将数据手动写入内核缓冲区。在调用内核之前,我必须在每个时间步执行此操作,以便内核对正确的数据进行操作。是否有可能使缓冲区中的数据写入与现有的 C++ 代码同步发生?

就目前而言,在请求内核之前,现有的 C++ 代码会执行另一个循环,其时间与我的内存传输时间一样长。这个循环不会改变或影响我在调用它之前必须写入内核的数据。是否有可能让内存传输在此期间同步发生?我更愿意主持运行循环,同时将数据写入缓冲区,从而节省宝贵的模拟时间。

谢谢!

最佳答案

我真的看不出这里有什么大问题。

您只需要异步复制数据,同时执行另一项操作。这可以简单地通过对 clEnqueueWriteBuffer() 的非阻塞调用来完成。此外,您甚至可以并行运行内核并继续在 CPU 中执行 C++ 循环。无需等待,因为内核数据独立于其他 C++ 循环数据。

//Get the data for OpenCL ready
...

//Copy it asynchronously
clEnqueueWriteBufer(queue, buffer, CL_FALSE, size, ptr_to_data);
clFlush(); //Ensure it gets executed (not really needed)
//Run the kernel (asynchronously as well)
clENqueueNDRangeKernel(...);

//Do something else
...
//Everything that is clEnqueueXXXX is run in the GPU, and does not take CPU cycles.

//Get the data back
clEnqueueReadBufer(...);

//Wait for the GPU to finish
clFinish(...); //Or, by making the read blocking

关于c++ - OpenCL/C++主机代码并发运行和内存维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com