CPU / Intel OpenCL性能问题,实施问题
我现在有几个问题在空中悬浮,没有答案。 出现这些问题是因为我有一个OpenMP和OpenCL实现相同的问题。 OpenCL在GPU上完美运行,但在CPU上运行时性能降低了50%(与OpenMP实现相比)。 一篇文章已经在讨论OpenMP和OpenCL性能之间的区别,但它并没有回答我的问题。 目前我面临这些问题:
1)具有“ 矢量化内核 ”(根据英特尔离线编译器)是否真的非常重要?
有一个类似的帖子,但我认为我的问题更一般。
据我所知:向量化内核不一定意味着在编译的二进制文件中没有向量/ SIMD指令。 我检查了我的内核的汇编代码,并且有一堆SIMD指令。 矢量化内核意味着通过使用SIMD指令,可以在一个CPU线程中执行4个(SSE)或8个(AVX)OpenCL“逻辑”线程。 这只有在所有数据连续存储在内存中才能实现。 但谁有这样完美的排序数据?
所以我的问题是:在这个意义上让你的内核“矢量化”真的很重要吗?
当然,它会提高性能,但如果内核中的大部分计算密集型部分都是通过向量指令完成的,那么您可能会接近“最佳”性能。 我认为我的问题的答案在于内存带宽。 可能向量更适合高效的内存访问。 在这种情况下,内核参数(指针)必须被矢量化。
2)如果我在CPU的 本地内存中 分配数据,它将在哪里分配? OpenCL将L1缓存显示为本地内存,但显然不是像GPU本地内存那样的相同类型的内存。 如果它存储在RAM /全局内存中,那么就没有意义将数据拷入其中。 如果它在缓存中,其他一些进程可能会将其清除......所以这也没有意义。
3)“逻辑”OpenCL线程如何映射到实际CPU软件/硬件(英特尔HTT)线程? 因为如果我的内核运行时间较短,并且内核像TBB(线程构建模块)或OpenMP那样分叉,那么分叉开销将占主导地位。
4)什么是线程叉开销 ? 是否有新的CPU线程分派给每个“逻辑”OpenCL线程,或者是CPU线程分叉一次,并重用于更多“逻辑”OpenCL线程?
我希望我不是唯一对这些小事感兴趣的人,而你们中的一些人现在可能会遇到这些问题。 先谢谢你!
UPDATE
3)目前OpenCL的开销比OpenMP更重要,因此高效的运行时执行需要大量的内核。 在Intel OpenCL中,工作组映射到TBB线程,因此1个虚拟CPU内核执行整个工作组(或线程块)。 如果可能,工作组将使用3个嵌套for循环来实现,其中最内层的循环是矢量化的。 所以你可以想象它是这样的:
#pragam omp parallel for
for(wg=0; wg < get_num_groups(2)*get_num_groups(1)*get_num_groups(0); wg++) {
for(k=0; k<get_local_size(2); k++) {
for(j=0; j<get_local_size(1); j++) {
#pragma simd
for(i=0; i<get_local_size(0); i++) {
... work-load...
}
}
}
}
如果最内层的循环可以进行矢量化,则用SIMD步骤执行:
for(i=0; i<get_local_size(0); i+=SIMD) {
4)每个TBB线程在OpenCL执行期间被分叉一次,并且它们被重用。 每个TBB线程都绑定到一个虚拟内核,即。 在计算过程中没有线程迁移。
我也接受@ natchouf-s的回答。
我可能对你的问题有一些提示。 在我的小经验中,为CPU调优的OpenCL实现无法胜过OpenMP实现 。 如果是这样,你可以改进OpenMP代码来打败OpenCL。
1) 矢量化内核非常重要 。 它与您的问题编号3和4相关联。如果您有一个处理4或8个输入值的内核,您将拥有更少的工作项目(线程),因此开销更少。 我建议使用OpenCL提供的向量指令和数据(如float4,float8,float16),而不是依赖自动向量化。 不要犹豫,使用float16(或double16):这将被映射到4个sse或2个avx向量,并将除以16所需的工作项目数量(这对CPU有好处,但并非总是适用于GPU:我使用2种不同的内核为CPU和GPU)。
2)CPU上的本地内存是RAM。 不要在CPU内核上使用它。
3和4)我真的不知道,这将取决于实施,但叉开销似乎对我很重要。
对于问题3:
英特尔组逻辑OpenCL线程合并成一个硬件线程。 并且组大小可以从4,8到16变化。逻辑OpenCL线程映射到执行单元的一个SIMD通道。 一个执行单元有两个宽度为4的SIMD引擎。请参阅以下文档以获取更多详细信息。 https://software.intel.com/sites/default/files/Faster-Better-Pixels-on-the-Go-and-in-the-Cloud-with-OpenCL-on-Intel-Architecture.pdf
链接地址: http://www.djcxy.com/p/46425.html上一篇: CPU/Intel OpenCL performance issues, implementation questions