Concurrency 用于并发内核启动的OpenCL多命令队列

Concurrency 用于并发内核启动的OpenCL多命令队列,concurrency,opencl,gpu,gpgpu,multi-gpu,Concurrency,Opencl,Gpu,Gpgpu,Multi Gpu,我正在尝试运行向量加法的应用程序,需要同时启动多个内核, 因此,对于并发内核启动,在我的最后一个问题中,有人建议我使用多个命令队列。 我用数组来定义它 context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &err); for(i=0;i<num_ker;++i) { queue[i] = clCreateCommandQueue(context, device_id, 0, &err)

我正在尝试运行向量加法的应用程序,需要同时启动多个内核, 因此,对于并发内核启动,在我的最后一个问题中,有人建议我使用多个命令队列。 我用数组来定义它

context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &err);
    for(i=0;i<num_ker;++i)
    {
queue[i] = clCreateCommandQueue(context, device_id, 0, &err);
    }
context=clCreateContext(NULL,1,&device\u id,NULL,NULL,&err);

对于(i=0;i我也阅读了您的最后一个问题,我认为您应该首先重新思考您真正想做什么,以及OpenCL是否真的是这样做的方式

OpenCL是一个用于masive并行处理和数据处理的API。 每个内核(或排队任务)在许多数据上并行运行 值,因此性能比任何串行CPU处理高出许多数量级

OpenCL的典型用例是运行数百万个工作项的内核。 更高级的应用程序可能需要不同内核的多个序列,以及CPU和GPU之间的特殊同步

但并发性从来都不是一个要求。(否则,单核CPU将无法执行任务,情况永远不会如此。速度会较慢,但仍有可能运行该任务)

即使两个任务需要同时运行。所用时间是否相同:

不同时发生的情况:

Kernel 1: *
Kernel 2: -
GPU Core 1: *****-----
GPU Core 2: *****-----
GPU Core 3: *****-----
GPU Core 4: *****-----
Kernel 1: *
Kernel 2: -
GPU Core 1: **********
GPU Core 2: **********
GPU Core 3: ----------
GPU Core 4: ----------
并发病例:

Kernel 1: *
Kernel 2: -
GPU Core 1: *****-----
GPU Core 2: *****-----
GPU Core 3: *****-----
GPU Core 4: *****-----
Kernel 1: *
Kernel 2: -
GPU Core 1: **********
GPU Core 2: **********
GPU Core 3: ----------
GPU Core 4: ----------
事实上,非并发情况是首选的,因为至少第一个任务已经完成,进一步的处理可以继续


据我所知,您想要做的是同时运行多个内核。这样内核就可以完全并发运行。例如,运行100个内核(相同内核或不同内核)并同时运行它们

这根本不适合OpenCL模型。事实上,它可能比CPU单线程慢得多。

如果每个内核独立于所有其他内核,那么一个内核(SIMD或CPU)一次只能分配给一个内核(因为它们只有一台PC),即使它们可以同时运行1k个线程。在理想情况下,这将在几个内核(6-10个)的池中转换OpenCL设备假设API支持它和设备,情况并不总是这样。在最坏的情况下,您将有一个运行单个内核的设备,并且浪费了99%

可以在OpenCL中完成的工作示例:

  • 数据处理/处理。乘向量,模拟粒子等
  • 图像处理、边界检测、滤波等
  • 视频压缩、编辑、生成
  • 光线跟踪、复杂灯光数学等
  • 分类
不适用于OpenCL的内容示例:

  • 正在发送异步请求(HTTP、流量、交互数据)
  • 处理少量数据
  • 处理需要对每种类型的数据进行完全不同的处理的数据

从我的观点来看,使用多个内核的唯一实际用例是后者,在这种情况下,无论你做什么,性能都会很糟糕。
最好改用多线程池。

非常感谢您抽出时间回答,我非常感谢,您的问题是正确的,我为什么要这么做。答案是,现在我正在进行一项研究,涉及不同的编程模型,如CUDA、openMP OpenCL等,以了解它们如何在不同的任务之间切换s、 当他们同时运行许多任务时,他们是如何扩展的,以及他们是如何达到的,很抱歉我不太清楚我想做什么,但是是的,你的回答解释了很多行为。谢谢:)