OpenCL示例程序在CPU上的执行速度比在GPU上快10倍

时间:2014-04-29 09:54:55

标签: c++ parallel-processing opencl gpgpu

我是OpenCL编程的新手,我决定从下载的AMD SDK中运行一些示例。我的第一选择是Reduction sample。每次我在CPU上执行程序时,我的执行时间比在GPU上低大约10倍。对于那些计算,GPU不比CPU好吗?

我的硬件:

  • CPU i5-2430M 2.40 Ghz
  • GPU AMD Radeon 6630M

在平台0(GPU)上执行:

$ Reduction.exe -x 33554432 -i 5 -q -t -p 0
Platform 0 : Advanced Micro Devices, Inc.
Platform 1 : Intel(R) Corporation

Selected Platform Vendor : Advanced Micro Devices, Inc.
Device 0 :        Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz Device ID is 009E83A0

Executing kernel for 5 iterations
-------------------------------------------
Exec: 1.64225

| Elements | Time(sec) | (DataTransfer + Kernel)Time(sec) |
|----------|-----------|----------------------------------|
| 33554432 | 1.83705   | 1.64225                          |

在平台1(CPU)上执行:

$ Reduction.exe -x 33554432 -i 5 -q -t -p 1
Platform 0 : Advanced Micro Devices, Inc.
Platform 1 : Intel(R) Corporation
GPU not found. Falling back to CPU device

Selected Platform Vendor : Intel(R) Corporation
Device 0 :        Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz Device ID is 040BEF1C

Executing kernel for 5 iterations
-------------------------------------------
Exec: 0.198049

| Elements | Time(sec) | (DataTransfer + Kernel)Time(sec) |
|----------|-----------|----------------------------------|
| 33554432 | 0.542269  | 0.198049                         |

3 个答案:

答案 0 :(得分:4)

根据您的输出判断,它们似乎都在您的CPU上运行。

第一个使用AMD平台,第二个使用Intel,但您的CPU在两个平台上都显示为设备0。尝试使用标记-d 1(使用设备1)或--device gpu

编辑:查看system requirements页面,AMD网站或OpenCL conformant products list,看起来您的GPU不受支持。

答案 1 :(得分:1)

根据此规范页面(gpuzoo.com),6630M设备应支持OpenCL 1.2。仔细检查您的驱动程序版本并确保它受支持。如果您仍然遇到问题,请尝试使用较旧的驱动程序。 driverscollection.com

尝试在您的系统上运行CLInfo程序,看看它是否全部有效。这应该会为您提供所支持的所有设备的完整详细信息。

答案 2 :(得分:0)

AMD SDK似乎选择英特尔作为其计算设备。难怪为什么,因为它可能基于设备的优先级。

如何解决,

1) Retrieve deviceid's for all GPU/CPU which has OpenCL support for particular platform (In your case ONE AMD GPU + ONE INTEL CPU).
1) After getting all device id's use device info to extract required device (You can use CL_DEVICE_VENDOR flag to extract the required deviceid)
3) and then use this deviceid in all further device id reference.