2014-05-06 934 views
11

我使用的是CUDA 6.0和与CUDA SDK捆绑在一起的OpenCL实现。我为每个平台有两个相同的内核(它们在平台特定的关键字中有所不同)。他们只能读写全局内存,每个线程都有不同的位置。 CUDA的启动配置为200 blocks of 250 threads (1D),它直接对应于OpenCL的配置 - 50,000 global work size and 250 local work sizeCUDA vs OpenCL性能对比

OpenCL代码运行速度更快。这是可能的还是我计时错了?我的理解是NVIDIA的OpenCL实现基于CUDA的实现。与OpenCL相比,我的性能提高了15%左右。

如果你能提出为什么我可能会看到这一点,并且可能与NVIDIA实施的CUDA和OpenCL之间的某些差异,那将是很棒的事情。

+0

结果在问题和案例中不一致。但你的也许是对的。 OpenCL在默认情况下是异步的,因此,如果您使用CUDA(非异步),那么性能可能会略微低于OpenCL。 – DarkZeros

+0

我已经听说NVIDIA的OCL实现是基于CUDA的。然而,每次我试图找到一些消息来源时,我从来没有找到任何证据。我的结论是,基于CUDA被错误地用作语言名称的事实是错误的,而实际上它是根据维基百科的“并行计算平台和编程模型”(Compute Unified Device Architecture)。因此,当你看到NVIDIA的幻灯片显示在OCL下有一个称为CUDA的GPU,这是一个CUDA芯片。如果你有任何问题,你可以发布你的来源吗?我很想知道。 – CaptainObvious

+1

OpenCL和CUDA完全不同。他们最终都使用相同的硬件。但是就像OpenGL和DirectX一样,其他人也不在其他人之下。要说明这一点,要点是库不同,编译器不同,执行模型也不同。有些部分可能很常见,但大多数不是。 – DarkZeros

回答

13

在现代GPU上执行的内核几乎不会受到计算限制,并且几乎总是受内存带宽限制。 (因为与可用的内存路径相比运行的计算内核太多了)。

这意味着给定内核的性能通常很大程度上取决于给定算法展现的内存访问模式。

实际上,这使得很难预测(甚至理解)提前期望的性能。

您观察到的差异可能是由于OpenCL与CUDA工具链进行的不同优化所导致的两个内核之间的内存访问模式的细微差异。

要了解如何优化GPU内核,您需要了解可用的内存缓存硬件的详细信息,以及如何充分利用它。 (例如,战略性地使用“本地”内存缓存而不是直接访问OpenCL中的“全局”内存。)