Optimization JNCI/JCOL内核优化

Optimization JNCI/JCOL内核优化,optimization,opencl,jocl,Optimization,Opencl,Jocl,我有一个内核通过一个jocl前端在OpenCL中运行,与其他内核相比,这个内核运行速度非常慢,我试图找出为什么以及如何加速它。这个内核非常基本。它唯一的工作就是减少我们拥有的样本点的数量。它每N个点从输入数组复制到较小的输出数组,以缩小数组大小 内核被传递一个浮点,指定在“好”点之间要跳过多少点。因此,如果通过1.5分,将跳过一分、十分、两分、一分等,以保持每跳过1.5分的平均值。输入数组已经在GPU上,它是由早期的内核生成的,输出数组将保留在内核上,因此不需要向CPU或从CPU传输数据 这个内

我有一个内核通过一个jocl前端在OpenCL中运行,与其他内核相比,这个内核运行速度非常慢,我试图找出为什么以及如何加速它。这个内核非常基本。它唯一的工作就是减少我们拥有的样本点的数量。它每N个点从输入数组复制到较小的输出数组,以缩小数组大小

内核被传递一个浮点,指定在“好”点之间要跳过多少点。因此,如果通过1.5分,将跳过一分、十分、两分、一分等,以保持每跳过1.5分的平均值。输入数组已经在GPU上,它是由早期的内核生成的,输出数组将保留在内核上,因此不需要向CPU或从CPU传输数据

这个内核的运行速度比其他内核慢3-5倍;比一些快速内核慢20倍。我意识到我因为没有合并数组访问而受到了惩罚;但我不敢相信这会让我跑得这么慢。在所有其他内核都接触数组中的每个样本之后,我认为接触数组中的ever X样本,即使没有合并,至少应该与接触数组中的每个样本的速度相同

原始内核实际上一次抽取了两个数组,用于实际数据和虚拟数据。我尝试将内核分成两个内核调用,一个用于抽取实数据,另一个用于抽取虚数据;但这一点都没有帮助。同样,我尝试通过让一个线程负责抽取3-4个点来“展开”内核;但这没有任何帮助。我尝试过处理每个内核调用中传递的数据的大小,即在数千个数据点上进行一次内核调用,或者在数量较少的数据点上进行几次内核调用,这使我能够调整出较小的性能增益;但并没有达到我认为这个内核值得在GPU上实现的数量级


为了给人一种规模感,这个内核每次迭代运行需要98毫秒,而对于相同的输入数组大小,FFT只需要32毫秒,而每个其他内核都需要5毫秒或更少的时间。还有什么原因会导致这样一个简单的内核与其他正在运行的内核相比运行得如此缓慢?有没有可能我实际上不能充分优化这个内核以保证在GPU上运行它。我不需要这个内核比CPU运行得更快;只是没有CPU那么慢,所以我可以在GPU上保持所有的处理。

事实证明,问题根本不在于内核。相反,问题是,当我试图释放我正在抽取的缓冲区时,它会导致整个程序在内核和队列中的所有其他内核完成时暂停。这似乎运行不正确,据我所知,clrelease应该只减少一个计数器,而不是阻塞队列。然而重要的一点是,我的内核正在以应有的效率运行。

这是在什么硬件上运行的?如果不跳过示例,而是全部读取,会发生什么?你仍然可以放弃那些你不想保留的。但是内核应该至少和其他的一样快。我用的是256MB的旧nvida卡。不幸的是,我不知道我是否被允许发布代码,因为我的公司对共享代码有过多的限制。我已经考虑过按照W.m.说的做。这将是我下一次尝试,在我被拖出工作岗位6个小时之前,呵呵。我现在就试试,看看会发生什么;这明显减慢了进程。然而,我注意到,当我尝试在CPU中计时时,如果我在释放调用之后将计时器放在被销毁的缓冲区上,我只会看到延迟。为什么释放会导致程序暂停,我认为释放只是减少了一个计数器,而不是实际执行释放或等待它发生?