2015-12-02 2 views
1

Я новичок в OpenCL и в настоящее время есть некоторые вопросы о его производительности.Intel HD GPU против Intel CPU Perfomance comparsion

У меня Intel (R) ядро ​​(TM) i5-4460 CPU @ 3.20GHz + убунту + 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 в 20 раз быстрее, чем один процессор (см. Таблицу выше). Мне кажется, это слишком мало, потому что в случае использования 4x ядер я получаю только 5-кратное ускорение на GPU. Я написал правильную скамью и ускорение, кажется, реалистично? К сожалению, в моем случае клипф не находит процессор как устройство OpenCL, поэтому я не могу напрямую сравнивать.

ОБНОВЛЕНИЕ

Измерения

$ G ++ -o Основной main.cpp -lOpenCL -std = C++ 11 $ времени ./main реальные 0m37.316s пользователя 0m37.280s SYS 0m0.016s $ G ++ -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 быстрее, чем один процессор => 5 раз быстрее, чем полный процессор.

+0

На что рассчитывают вы? Как правило, вы можете сравнить максимальную пропускную способность. –

+0

Вероятно, предпочтительная ширина поплавка hd равна 8, тогда как предпочтительная ширина процессора cpu равна 4. Вы используете скалярный код opencl, который может поддерживать процессор. Используйте его float8. Затем спросите еще раз. –

+4

Измерение самого быстрого устройства CL путем выполнения векторных сумм 10k элементов, как измерение более быстрого бегуна путем пробега на расстоянии 1 м. Там будет, узкое место памяти, IO/накладные расходы, накладные расходы, .... что делает все измерения недействительными. Кроме того, как они отмечали, даже ваши ядра не эквивалентны. – DarkZeros

ответ

1

2 варианта реализации, которые вы сравниваете: не функционально эквивалентный.

Реализация вашего процессора требует на 30% меньше пропускной способности памяти (что может объяснить производительность). Он получает доступ только к массиву A и B, а в ядре GPU используются 3 массива a, b и c.

+0

OP изменил код в вопросе после того, как этот ответ был опубликован, и теперь сообщает об увеличении OpenCL в два раза больше. –

Смежные вопросы