英特尔HD GPU与英特尔CPU性能比较

3

我是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, ", "));
}

根据我的测量结果,Intel HD比单个CPU快20倍(见上面的测试)。这对我来说似乎太小了,因为在使用4个核心时,GPU只能获得5倍的加速。我的测试和加速度似乎是合理的吗?不幸的是,在我的情况下,clinfo无法将CPU识别为OpenCL设备,因此我无法进行直接比较。
更新: 测量结果如下: $ g++ -o main main.cpp -lOpenCL -std=c++11 $ time ./main real 0m37.316s user 0m37.280s sys 0m0.016s $ g++ -o main main.cpp -lOpenCL -std=c++11 $ time ./main real 0m2.349s user 0m0.524s sys 0m0.624s
总计:2.349-0.524=1.825,用于GPU; 37.316-0.524=36.724,用于CPU。
36.724/1.825=20.12倍于单个CPU的速度=>比完整的CPU快5倍。

你的期望基于什么?作为一个非常粗略的指导,你可以比较峰值吞吐量。 - void_ptr
可能hd最喜欢的浮点宽度是8,而单个CPU核心最喜欢的宽度是4。您正在使用标量OpenCL代码,这可能更适合CPU。将其使用float8,然后再次询问。 - huseyin tugrul buyukisik
5
通过对1万个元素进行矢量求和来测量最快的CL设备,就像通过跑1米的距离来测量更快的跑步者一样。这样做会存在内存瓶颈、 IO/开销、启动开销等问题,导致所有测量结果无效。同时,正如他们指出的那样,即使你的内核是等价的也可能存在差异。 - DarkZeros
@huseyintugrulbuyukisik 请参见上文: Context(CL_DEVICE_TYPE_GPU); - Marat Zakirov
1个回答

1
你正在比较的两种实现并不在功能上等价。
你的CPU实现需要少30%的内存带宽(这可能解释了性能问题)。 它仅访问数组AB,而GPU核心使用的是3个数组abc

这个回答发布后,楼主修改了问题中的代码,并且现在报告OpenCL加速比之前提高了一倍。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接