Изпълнението на програмата отнема почти същото потребителско време на CPU, както и на GPU?

Програмата за намиране на прости числа с помощта на OpenCL 1.1 даде следните показатели:

Устройство: CPU

Реално време: прибл. 3 секунди потребителско време: прибл. 32 сек

Устройство: GPU

В реално време - прибл. 37 секунди потребителско време - прибл. 32 сек

Защо потребителското време за изпълнение от GPU не е по-малко от това на CPU? Не се случва ли паралелизиране на данни/задача?

Системни спецификации: 64-битова система CentOS 5.3 с две графични карти ATI Radeon 5970 + процесор Intel Core i7 (12 ядра)


person whitepearl    schedule 23.03.2012    source източник
comment
Сигурен ли си, че твоят i7 има 12 ядра? Мислех, че можете да получите само до 6 ядра (12 нишки)   -  person Peter Lawrey    schedule 26.03.2012


Отговори (1)


Вашето ядро ​​е доста неефективно, имам коригирано по-долу, което да разгледате. Що се отнася до това защо работи по-добре на устройство с процесор...

  1. Използвайки вашия алгоритъм, работните елементи отнемат различно време за изпълнение. Те ще отнемат повече време, тъй като тестваните числа нарастват. Работна група на графичен процесор няма да завърши, докато не бъдат завършени всички нейни елементи, част от хардуера ще остане неактивен, докато последният елемент не бъде готов. На процесора той се държи по-скоро като цикъл, итериращ над елементите на ядрото, така че разликата в циклите, необходими за изчисляване на всеки елемент, няма да повлияе драстично на производителността.
  2. 'A' не се използва от ядрото. Не трябва да се копира, освен ако не се използва. Изглежда, че сте искали да тествате A[i], а не самото "i".

Мисля, че графичният процесор би бил много по-добър в базираните на FFT прости изчисления или дори алгоритъм на сито.

{
    int t;
    int i = get_global_id(0);
    int end = sqrt(i);

    if(i%2){
        B[i] = 0;
    }else{
        B[i] = 1; //assuming only that it should be non-zero
    }
    for ( t = 3; (t<=end)&&(B[i] > 0) ; t+=2 ) {
        if ( i % t == 0 ) {
            B[ i ] = 0;
        }
    }
}
person mfa    schedule 23.03.2012