【发布时间】:2016-03-06 21:22:09
【问题描述】:
我是 OpenCL 的新手,目前对其性能有一些疑问。
我有 Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz + ubuntu + Beignet(Intel 开源 openCL 库参见:http://arrayfire.com/opencl-on-intel-hd-iris-graphics-on-linux/http://www.freedesktop.org/wiki/Software/Beignet/)
我有简单的板凳
#define __CL_ENABLE_EXCEPTIONS
#include "CL/cl.hpp"
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace cl;
using namespace std;
void CPUadd(vector<float> & A, vector<float> & B, vector<float> & C)
{
for (int i = 0; i < A.size(); i++)
{
C[i] = A[i] + B[i];
}
}
int main(int argc, char* argv[]) {
Context(CL_DEVICE_TYPE_GPU);
static const unsigned elements = 1000000;
vector<float> data(elements, 6);
Buffer a(begin(data), end(data), true, false);
Buffer b(begin(data), end(data), true, false);
Buffer c(CL_MEM_READ_WRITE, elements * sizeof(float));
Program addProg(R"d(
kernel
void add( global const float * restrict const a,
global const float * restrict const b,
global float * restrict const c) {
unsigned idx = get_global_id(0);
c[idx] = a[idx] + b[idx] + a[idx] * b[idx] + 5;
}
)d", true);
auto add = make_kernel<Buffer, Buffer, Buffer>(addProg, "add");
#if 1
for (int i = 0; i < 4000; i++)
{
add(EnqueueArgs(elements), a, b, c);
}
vector<float> result(elements);
cl::copy(c, begin(result), end(result));
#else
vector<float> result(elements);
for (int i = 0; i < 4000; i++)
{
CPUadd(data, data, result);
}
#endif
//std::copy(begin(result), end(result), ostream_iterator<float>(cout, ", "));
}
根据我的测量,英特尔 HD 比单 CPU 快 20 倍(参见上面的工作台)。它对我来说似乎太小了,因为如果使用 4x 内核,我在 GPU 上只能获得 5x 加速。我是否写了正确的板凳和加速似乎是现实的?不幸的是,在我的情况下,clinfo 找不到 CPU 作为 OpenCL 设备,所以我无法直接比较。
更新
测量
$ g++ -o main main.cpp -lOpenCL -std=c++11 $ 时间 ./main 真正的 0m37.316s 用户 0m37.280s 系统 0m0.016s $ g++ -o main main.cpp -lOpenCL -std=c++11 $ 时间 ./main 实际0m2.349s 用户 0m0.524s 系统 0m0.624s
总计:2.349 - 0.524 = 1.825(GPU) CPU 为 37.316 - 0.524 = 36.724
36.724 / 1.825 = 比单 CPU 快 20.12 倍 => 比全 CPU 快 5 倍。
【问题讨论】:
-
您的期望是基于什么?作为非常粗略的指南,您可以比较峰值吞吐量。
-
可能 hd 的首选浮点宽度是 8,而单个 cpu 核心的首选宽度 cpu 是 4。您正在使用可能有利于 cpu 的标量 opencl 代码。让它使用float8。然后再问。
-
通过对 10k 个元素进行矢量和来测量最快的 CL 设备,就像通过跑 1m 距离来测量更快的跑步者一样。将会有内存瓶颈、IO/开销、启动开销……这使得所有测量都无效。此外,正如他们所指出的,即使您的内核也不相同。
-
@huseyintugrulbuyukisik 见上文:上下文(CL_DEVICE_TYPE_GPU);
标签: c++ linux performance opencl intel