小编las*_*dre的帖子

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软件/硬件(Intel HTT)线程?因为如果我有短的运行内核并且内核像TBB(线程构建块)或OpenMP那样分叉,那么fork开销将占主导地位.

4)什么是线程叉开销?是否为每个"逻辑"OpenCL线程分叉了新的CPU线程,或者是一次分叉的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...
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果最内部的循环可以进行矢量化,则可以使用SIMD步骤:

for(i=0; i<get_local_size(0); i+=SIMD) {
Run Code Online (Sandbox Code Playgroud)

4)每个TBB线程在OpenCL执行期间分叉一次并重用它们.每个TBB线程都绑定到一个虚拟核心,即.在计算过程中没有线程迁移.

我也接受@ natchouf的回答.

cpu intel vectorization opencl hyperthreading

10
推荐指数
1
解决办法
2147
查看次数

clEnqueueBarrier和clFinish有什么区别?

OpenCL 1.1规范说:

cl_int clEnqueueBarrier(cl_command_queue command_queue)

clEnqueueBarrier是一个同步点,可确保command_queue中的所有排队命令在下一批命令开始执行之前已完成执行.

cl_int clFinish(cl_command_queue command_queue)

阻止将所有先前在command_queue中排队的OpenCL命令发送到关联设备并完成.在处理完成command_queue中的所有排队命令之前,clFinish不会返回.clFinish也是一个同步点.

应该对有序或无序执行做些什么,但我看不出差别.如果我有顺序执行,他们是否需要?目前我做的事情如下:

...
for(...){
    clEnqueuNDRangeKernel(...);
    clFlush(command_queue);
    clFinish(command_queue);
}
...
Run Code Online (Sandbox Code Playgroud)

在Nvidia GPU上.任何相关评论表示赞赏.

gpu opencl

7
推荐指数
1
解决办法
4157
查看次数

标签 统计

opencl ×2

cpu ×1

gpu ×1

hyperthreading ×1

intel ×1

vectorization ×1