C++ OpenCL clEnqueueTasks并行性

C++ OpenCL clEnqueueTasks并行性,c++,aes,opencl,gpgpu,C++,Aes,Opencl,Gpgpu,我试图写一些代码,做AES解密。我有代码工作,但我希望能够添加密码块链接,这需要我在解密后执行异或操作 为了使代码更易于编写和理解,我使用两个内核编写了代码。一个对单个块进行解密,另一个对CBC部分进行异或。然后,我通过clEnqueueTask为每个16字节的数据块将这些数据提交给队列,这些数据块的依赖关系由解密和XOR之间的事件指定 事实证明,这是非常缓慢的,它的工作原理是,它以正确的顺序执行它们,但是它似乎没有并行执行 有人知道为什么或者如何在不损失粒度的情况下提高性能吗?通常用于单线程任

我试图写一些代码,做AES解密。我有代码工作,但我希望能够添加密码块链接,这需要我在解密后执行异或操作

为了使代码更易于编写和理解,我使用两个内核编写了代码。一个对单个块进行解密,另一个对CBC部分进行异或。然后,我通过clEnqueueTask为每个16字节的数据块将这些数据提交给队列,这些数据块的依赖关系由解密和XOR之间的事件指定

事实证明,这是非常缓慢的,它的工作原理是,它以正确的顺序执行它们,但是它似乎没有并行执行

有人知道为什么或者如何在不损失粒度的情况下提高性能吗?

通常用于单线程任务

如果您的内核可以并行执行,请使用一个调用,而不是大量使用不同参数的
clenqueetask
调用

另一个可能妨碍良好并行性能的因素是大量的全局内存访问。与计算量相比,如果内核中的全局内存读/写量很大,则可能会降低速度,具体取决于硬件。

通常用于单线程任务

如果您的内核可以并行执行,请使用一个调用,而不是大量使用不同参数的
clenqueetask
调用


另一个可能妨碍良好并行性能的因素是大量的全局内存访问。如果与计算量相比,您在内核中执行了大量全局内存的读/写操作,那么这可能会降低速度,具体取决于您的硬件。

通过clEnqueueTask执行的内核基本上是单线程的,这意味着全局工作大小为1,并且此单线程的任务占用整个计算单元。这对性能有很大影响,因为在典型的GPU上,您可以并行执行8-16个任务/工作组(CL_设备\最大\计算\单位),在工作组中,您可以执行256-1024个任务(CL_设备\最大\工作\组大小)。因此,在您的情况下,您可以实现8-16倍的并行性,而不是理论上的最大15000x,因为您无法利用整个硬件。

通过clEnqueueTask执行的内核基本上是单线程的,这意味着全局工作大小是1,并且任务占用了这个单线程的整个计算单元。这对性能有很大影响,因为在典型的GPU上,您可以并行执行8-16个任务/工作组(CL_设备\最大\计算\单位),在工作组中,您可以执行256-1024个任务(CL_设备\最大\工作\组大小)。因此,在您的情况下,您可以实现8-16x并行性,而不是理论上的最大15000x并行性,因为您无法利用整个硬件。

请注意,此函数在版本CL1.2中已被弃用,必须由对Rangnd内核调用()的相关调用替换请注意,此函数在版本CL1.2中已被弃用,必须由对Rangnd内核调用()的相关调用替换