C++ OpenCL示例程序在CPU上的执行速度是GPU上的10倍

C++ OpenCL示例程序在CPU上的执行速度是GPU上的10倍,c++,parallel-processing,opencl,gpgpu,C++,Parallel Processing,Opencl,Gpgpu,我对OpenCL编程一无所知,我决定从下载的AMDSDK中运行一些示例。我的第一选择是。每次我在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

我对OpenCL编程一无所知,我决定从下载的AMDSDK中运行一些示例。我的第一选择是。每次我在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                         |

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

第一个是使用AMD平台,第二个是使用Intel,但您的CPU在两个平台上都显示为设备0。尝试使用标志-d1来使用设备1或-devicegpu


编辑:查看AMD网站上的页面或,看起来您的GPU不受支持。

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

第一个是使用AMD平台,第二个是使用Intel,但您的CPU在两个平台上都显示为设备0。尝试使用标志-d1来使用设备1或-devicegpu


编辑:查看页面、AMD网站或,您的GPU似乎不受支持。

AMD SDK似乎选择Intel作为其计算设备。难怪会这样,因为这可能是基于设备的优先级

如何修复它

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.

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.

根据本规范页面,6630M设备应支持OpenCL 1.2。仔细检查您的驱动程序版本并确保它受支持。如果您仍然有问题,也可以尝试使用较旧的驱动程序


试着在你的系统上运行CLInfo程序,看看是否一切正常。这将为您提供支持的所有设备的完整详细信息。

根据本规范页面,6630M设备应支持OpenCL 1.2。仔细检查您的驱动程序版本并确保它受支持。如果您仍然有问题,也可以尝试使用较旧的驱动程序


试着在你的系统上运行CLInfo程序,看看是否一切正常。这将为您提供所支持的所有设备的完整详细信息。

使用标志-d 1时,输出设备ID应为0-设备gpu和设备cpu给出相同的结果。但你是对的,我的GPU没有列在设备部分。有没有办法解决这个问题?我已经为OpenCL安装了最新的AMD SDK。不幸的是,我不认为6630M是受支持的设备,这可以解释为什么它没有出现。使用标志-d 1给出的输出设备ID应该是0-设备gpu和设备cpu给出相同的结果。但你是对的,我的GPU没有列在设备部分。有没有办法解决这个问题?我已经为OpenCL安装了最新的AMD SDK。不幸的是,我不认为6630M是受支持的设备,这可以解释为什么它没有出现。当我执行clinfo.exe时,我看到了Turks设备,实际上是6630M GPU。然后我检查了我的代码,我用了CL_设备型CPU而不是CL_设备型GPU。我可能错改了什么,现在一切正常。GPU的速度大约是CPU的两倍。我很高兴它现在能为您工作。您是否尝试了足够大的数据集以获得最佳性能度量?当我执行clinfo.exe时,我看到了Turks设备,它实际上是6630M GPU。然后我检查了我的代码,我用了CL_设备型CPU而不是CL_设备型GPU。我可能错改了什么,现在一切正常。GPU的速度大约是CPU的两倍。我很高兴它现在能为您工作。您是否尝试使用足够大的数据集来获得最佳性能度量?