gpt4 book ai didi

c - 如何使用 OpenCL 将内存从 CPU 并行传输到 GPU?

转载 作者:太空宇宙 更新时间:2023-11-04 02:43:14 25 4
gpt4 key购买 nike

全部。我只有一个 GPU 设备 Nvidia GTX 750。我做了一个测试,使用 clEnqueueWriteBuffer 在一个线程中将数据从 CPU 复制到 GPU。然后我通过使用多个线程来完成它。结果是多线程看起来更慢。使用多线程时,每个线程都有自己的内核/命令队列/上下文,它们由同一设备创建。所以我的问题是 clEnqueueWriteBuffer 调用对一个设备有一些锁定吗?我怎样才能减少这些影响?

最佳答案

编辑:如果工作负载对于硬件而言太轻,多个并发命令队列可以获得更好的总带宽。

与 opengl 一样,opencl 需要将多个缓冲区批处理为单个缓冲区以提高速度,即使使用单个 opencl 内核参数也比使用多个参数更快。因为每个操作都有操作系统/api 开销。移动更大但更少的 block 更好。

您可以购买两 block 显卡,组合起来相当于 gtx 750,以使用多个 pci-e 带宽(如果您的主板可以分别提供两个 16x channel )

Pcie channel 是双向的,因此您可以尝试并行化写入和读取并行化可视化和计算并行化计算和写入>parallelize compute and readsparallelize compute+write+read(当然如果它们不像图 1-a 那样相互依赖)如果你的算法中有这样的算法并且你的显卡可以做到。

一旦我尝试在一个大数组上分而治之来计算并将每个部分发送到 gpu,它只需要几秒钟。现在我只用一次调用来计算,一次调用一次计算。只需几毫秒。

图 1-a:

write iteration   ---  compute iteration  ---- read iteration  --- parallels
1 - - 1
2 1 - 2
3 2 1 3
4 3 2 3
5 4 3 3
6 5 4 3

如果迭代之间没有依赖关系。如果存在依赖关系,则:

图 1-b:

write iteration   ---  compute iteration  ---- read iteration  --- parallels
half of 1 - - 1
other half of 1 half of 1 - 2
half of 2 other half of 1 half of 1 3
other half of 2 half of 2 other half of 1 3
half of 3 other half of 2 half of 2 3
other half of 3 half of 3 other half of 2 3

如果您需要在具有非常量大小的图像批处理之间进行并行处理:

 cpu to gpu   --------    gpu to gpu  -----   compute -----  gpu to cpu
1,2,3,4,5 - - -
- 1,2,3 - -
- 4,5 1,2,3 -
- - 4,5 1,2,3
6,7,8,9 - - 4,5
10,11,12 6,7,8 - -
13,14 9,10,11 6,7 -
15,16,17,18 12,13,14 8,9,10 6

关于c - 如何使用 OpenCL 将内存从 CPU 并行传输到 GPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29844500/

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