Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL:如何在没有多线程的情况下在不同的设备上分发计算_C_Multithreading_Opencl_Openmp - Fatal编程技术网

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

OpenCL:如何在没有多线程的情况下在不同的设备上分发计算,c,multithreading,opencl,openmp,C,Multithreading,Opencl,Openmp,关于比较在不同设备上执行简单阵列添加作业(C[i]=a[i]+B[i])所需的时间,我做了一些改进,以针对不同的阵列长度重复该过程,并返回所需的时间: X轴是以2为底的对数数组长度,Y轴是以10为底的对数时间。从2^13和2^14之间的某个地方可以看出,GPU的速度比CPU快。我想这是因为与计算相比,内存分配变得微不足道。(GPI1是一个输入错误,我的意思是GPU1) 现在希望是正确的,我可以估计在不同设备上进行阵列加法所需的时间:CPU为f1(n),第一个GPU为f2(n),第二个GPU为f

关于比较在不同设备上执行简单阵列添加作业(C[i]=a[i]+B[i])所需的时间,我做了一些改进,以针对不同的阵列长度重复该过程,并返回所需的时间:

X轴是以2为底的对数数组长度,Y轴是以10为底的对数时间。从2^13和2^14之间的某个地方可以看出,GPU的速度比CPU快。我想这是因为与计算相比,内存分配变得微不足道。(GPI1是一个输入错误,我的意思是GPU1)

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

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

    我完全是OpenCL的初学者,所以如果你们能帮助我知道它是否可行以及如何实现,我将不胜感激。也许已经有一些这样做的例子,请让我知道。提前谢谢


    p.S.我也在Reddit上发布了这个问题。

    这个问题的解读隐含地告诉您解决方案应该是并发的(异步的),因此您需要同时添加来自三个不同设备的结果,否则您将首先在设备a上运行一个进程,然后是设备B,然后是设备C(最好在速度最快的设备上运行单个进程),如果您计划有效地学习利用OpenCL编程(在mCPU/GPU上),您应该可以轻松地进行异步编程(实际上是多线程的).

    因此,当以前的设备正在执行其业务时,主机无法将新任务分配给其他设备?只有赋值和捕获是顺序的。当然可以,OpenCL排队API是异步的。您可以开始在GPU上工作,然后在GPU繁忙时在CPU上工作。