【发布时间】:2014-08-21 18:57:55
【问题描述】:
我有一个非常简单的任务:多次扫描一个 char 数组 (16*1024)。我用 pthread 实现了它,一个线程在一个 CPU 内核上。时间是 23 点。然后我用设备裂变创建了一个只包含一个CPU计算单元(即一个CPU核)的设备,时间只有17个。在我看来,OpenCL 实现应该比 pthread 慢(因为 C 更接近硬件)。我怎么会得到这个结果?
【问题讨论】:
我有一个非常简单的任务:多次扫描一个 char 数组 (16*1024)。我用 pthread 实现了它,一个线程在一个 CPU 内核上。时间是 23 点。然后我用设备裂变创建了一个只包含一个CPU计算单元(即一个CPU核)的设备,时间只有17个。在我看来,OpenCL 实现应该比 pthread 慢(因为 C 更接近硬件)。我怎么会得到这个结果?
【问题讨论】:
OpenCL 内核语言非常接近硬件。它是 C99 的超子集(不支持函数指针的子集,以及具有矢量数据类型等的超集)
实现通常建立在 llvm 之上,内核编译为原始 X86 函数。此外,由于 OpenCL 的性质,实现可以比完整的 C 编译器做更多的优化,例如更好地支持自动向量化。因此,编写为 OpenCL 内核的代码可以轻松胜过相同的幼稚循环版本,这并不奇怪。必须做很多工作才能使其接近 OpenCL 版本。
目前,尤其是英特尔 CPU OpenCL 实现主要是编写并行 CPU 代码的绝佳方式。即使在您的情况下,您将其限制为仅单核,但几乎可以肯定它使用了 X86 可用矢量指令的全部范围。
【讨论】: