2015-12-02 109 views
1

我是OpenCL的新手,目前對其性能有一些疑問。Intel HD GPU vs Intel CPU性能比較

我有英特爾(R)核心(TM)i5-4460 CPU @ 3.20GHz +的ubuntu +貝奈特餅(英特爾開源的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上獲得5倍的加速。我寫了正確的板凳和加速似乎是現實的嗎?不幸的是,在我的情況下,clinfo沒有找到CPU作爲OpenCL設備,所以我不能直接比較。

UPDATE

測量

$克++ -o主要的main.cpp -lOpenCL -std = C++ 11 $時間./main 真實0m37.316s 用戶0m37.280s SYS 0m0.016s $克++ -o主要的main.cpp -lOpenCL -std = C++ 11 $時間./main 真實0m2.349s 用戶0m0.524s SYS 0m0.624s

總計:2.349 - 0.524 1.825 =針對GPU 37.316 - 0.524 = 36.724對於CPU

36.724/1.825 = 20.12x比單CPU => 5倍比全CPU要快。

+0

您的期望是基於什麼?作爲一個粗略的指導方針,您可以比較峯值吞吐量。 –

+0

可能hd的首選浮點寬度是8,而單個cpu核心的首選寬度cpu是4.您正在使用可能傾向於cpu的標量opencl代碼。讓它使用float8。然後再問一次。 –

+4

通過做10k元素的矢量和來測量速度最快的CL設備,就像運行1m距離來測量更快的跑步者。會有內存瓶頸,IO /開銷,啓動開銷,......這使得所有的測量無效。而且,正如他們指出的那樣,即使你的內核也不相同。 – DarkZeros

回答

1

你比較的兩個實現是而不是在功能上等價。

您的CPU實現需要30%的內存帶寬(這可能會解釋性能)。它僅訪問陣列AB,而GPU內核正在使用3個陣列a,bc

+0

在發佈此答案後,OP更改了問題中的代碼,現在報告的OpenCL加速比兩倍大。 –