所有。我只有一个GPU设备Nvidia GTX 750.我做了一个测试,使用clEnqueueWriteBuffer在一个单独的线程中将数据从CPU复制到GPU。然后我通过使用多个线程来完成它。结果是多线程看起来更慢。 使用多个线程时,每个线程都有自己的内核/命令队列/上下文,由同一设备创建。所以我的问题是,clEnqueueWriteBuffer调用对一个设备有一些锁吗?我怎样才能减少这些影响呢?
答案 0 :(得分:2)
编辑:如果工作负载对于硬件来说太轻,多个并发命令队列可以实现更好的总带宽。
与opengl一样,opencl需要将多个缓冲区批量化为单个缓冲区以获得更快,即使使用单个opencl内核参数与多个参数相比也更快。因为每个操作都有操作系统/ api开销。移动更大但更少的块更好。
你可以购买两张相当于gtx 750的显卡,使用多个pci-e带宽(如果你的主板可以分别提供两个16x通道)
Pcie通道是两种方式,因此您可以尝试并行化写入和读取或并行化可视化和计算或并行化计算和写入或并行化计算和读取或并行化计算+写入+读取(当然,如果它们不相互依赖,如图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