我正在使用JOGL / openCL编写程序来利用GPU。当我们使用数据大小(我想要检测GPU上的可用内存)时,我有一些代码可以启动。如果GPU上的内存不足以立即处理整个计算,则会将进程分解为具有X个帧的子进程,这些帧利用的GPU数据量将少于存储的最大GPU全局内存。
我原本以为使用X的最大可能值会通过最小化使用的内核数量来提供最大的加速。相反,我发现使用较小的组(X / 2或X / 4)给我更好的速度。我试图弄清楚为什么要将GPU处理分成更小的组,而不是让GPU处理一次可以处理的最大量,这样可以提高速度;以及如何优化以确定X的最佳值是什么。
我目前的测试一直在GPU内核上运行,它使用很少的处理能力(两个内核通过选择部分输入并返回它来抽取输出)但是,我相当肯定当我激活所有内核时会发生相同的效果在返回之前对值的处理程度更大。
答案 0 :(得分:1)
简短的回答是,它很复杂。有很多因素在起作用。这些包括(但不限于):
我建议您查看以下链接:
http://courses.engr.illinois.edu/ece498/al/textbook/Chapter5-CudaPerformance.pdf
特别是,请查看 5.3部分。 SM资源的动态分区。本文旨在用于通用目的,但使用CUDA作为示例。但是,这些概念仍然适用于OpenCL。
本文来自以下书籍:
为了它的价值,我发现这本书非常有用。它将使您更深入地了解硬件,使您能够回答这样的问题。
答案 1 :(得分:0)
PCI-e是全双工双向的。我认为这意味着你可以在阅读时写作。在这种情况下,如果你正在进行很少的处理,你可能会看到一个收益,因为你用写入重写了读。
在一个工作单位中考虑N的总大小:
总时间与:过程N,转移2N
成比例如果你用并行读/写将它分成两部分,你可以得到:
总时间与:过程N,转移3N / 2(保存N / 2转移时间)