Выполнение программы занимает почти одинаковое время пользователя как на процессоре, так и на графическом процессоре?

программа для поиска простых чисел с использованием OpenCL 1.1 дала следующие результаты:

Устройство: ЦП

В реальном времени: прибл. 3 сек. Время использования: прибл. 32 сек

Устройство: Графический процессор

Реальное время - ок. 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».

Я думаю, что графический процессор был бы намного лучше в простых вычислениях на основе БПФ или даже в алгоритме сита.

{
    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