OpenCL:如何在没有多线程的情况下在不同设备上分发计算

时间:2018-05-13 18:48:59

标签: c multithreading opencl openmp

关于我former post关于比较在不同设备上执行简单数组添加工作(C [i] = A [i] + B [i])所需的时间,我改进了the code a稍微重复一下不同阵列长度的过程,并给出所需的时间:

enter image description here X轴是以对数为基数2的数组长度,Y是以对数为基数10的时间。在2 ^ 13和2 ^ 14之间可以看到GPU变得比中央处理器。我想这是因为与计算相比,内存分配可以忽略不计。 (GPI1是拼写错误,我的意思是GPU1)。

现在希望my C-OpenCL code是正确的我可以估计在不同设备上添加数组所需的时间:CPU的f1(n),第一个GPU的f2(n)和f3(n)对于第二个GPU。如果我有一个长度为n的数组作业,理论上我应该将它分成3个部分,如n1 + n2 + n3 = n,并且满足f1(n1)= f2(n2)= f3(n3 )并将其分布在我系统上的三个设备上,以便尽可能快地计算。我想我可以使用OpenMP或任何其他多线程方法来实现它,并使用我的CPU核心来承载三个不同的OpenCL任务。这不是我喜欢做的事情,因为:

  1. 这是一种资源浪费。其中两个核心只是托管,可以用于计算
  2. 它使代码更复杂。
  3. 我不知道怎么做。我现在使用带有-framework OpenCL的Apple Clang编译器来编译代码,但对于OpenMP,我必须使用GNU编译器。我不知道如何在其中一个编译器上使用OpenMP和OpenCL。
  4. 现在我在考虑是否有任何方法可以在没有多线程的情况下进行此分发?例如,如果其中一个CPU内核将任务分配给三个设备,然后以相同(或不同)的顺序捕获结果,然后将它们连接起来。可能需要进行一些实验来调整子任务的任务分配时间,但我想这应该是可能的。

    我是OpenCL的初学者,所以如果你们能帮我知道是否有可能以及如何做,我将不胜感激。也许已经有一些例子,请告诉我。提前谢谢。

    P.S。我还在Reddit上发布了此问题herehere

0 个答案:

没有答案