【问题标题】:Intel HD GPU vs Intel CPU Perfomance comparsionIntel HD GPU 与 Intel CPU 性能比较
【发布时间】: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


【解决方案1】:

您要比较的两个实现在功能上等效。

您的 CPU 实现需要减少 30% 的内存带宽(这可以解释性能)。它仅访问数组AB,而GPU 内核使用3 个数组abc

【讨论】:

  • 在发布此答案后,OP 更改了问题中的代码,现在报告的 OpenCL 加速提高了两倍。
猜你喜欢
  • 2015-01-10
  • 2019-02-10
  • 2018-07-21
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多