我正在尝试编写一些执行AES Decryption的代码。我有代码工作,但我希望能够添加密码块链接,这需要我在解密后执行XOR操作。
为了使代码更易于编写和理解,我使用两个内核编写代码。一个在单个块上进行解密,另一个在CBC部分进行XOR。然后,我通过clEnqueueTask将这些数据提交给队列,每个16字节的数据块具有由Decryption和XOR之间的事件指定的依赖关系。
事实证明这是非常慢的,它的工作原理是它以正确的顺序执行它们,但它似乎并没有并行执行。
有没有人知道为什么或如何在不丢失粒度的情况下提高性能?
答案 0 :(得分:1)
clEnqueueTask通常用于单线程任务。
如果您的内核可以并行执行,请使用一个clEnqueueNDRangeKernel调用,而不是使用不同参数的大量clEnqueueTask
调用。
可能阻止良好并行性能的其他因素是大量的全局内存访问。如果你在内核中进行大量的全局内存读/写与计算量相比,那么根据你的硬件可能会降低你的速度。
答案 1 :(得分:0)
通过clEnqueueTask执行的内核本质上是单线程的,这意味着全局工作大小为 1 ,并且该任务占用该单个线程的整个计算单元。这对性能影响很大,因为在典型的GPU上,您可以并行执行8-16个任务/工作组(CL_DEVICE_MAX_COMPUTE_UNITS),在工作组中可以执行256-1024(CL_DEVICE_MAX_WORK_GROUP_SIZE)。因此,在您的情况下,您可以实现8-16x并行性,而不是理论上的最大15000x,因为您无法使用整个硬件。