Вопрос

Я работаю над небольшим количеством кода, и я стараюсь оптимизировать его как можно больше, в основном получаю его под определенным ограничением времени.

Ниже приведен звонок ...

static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);

... и следующее - это то, что выполняется.

void operator()(const blocked_range<size_t> &r) const {

    int temp;
    int i;
    int j;
    size_t k;
    size_t begin = r.begin();
    size_t end = r.end();

    for(k = begin; k != end; ++k) { // for each trainee
        temp = 0;
        for(i = 0; i < N; ++i) { // for each sample
            int trr = trRating[k][i];
            int ei = E[i];              
            for(j = 0; j < ei; ++j) { // for each expert
                temp += delta(i, trr, exRating[j][i]);
            }
        }           
        myscore[k] = temp;
    }
}

Я использую TBB Intel для оптимизации этого. Но я также читал о SIMD и SSE2 и вещах вдоль этой природы. Итак, мой вопрос, как я могу хранить переменные (i, j, k) в регистров, чтобы их можно было бы получить быстрее CPU? Я думаю, что ответ должен делать с реализацией SSE2 или некоторой вариации этого, но я понятия не имею, как это сделать. Любые идеи?

Редактировать: Это будет запускаться на поле Linux, но используя компилятор Intel, который я полагаю. Если это поможет, мне нужно запустить следующие команды, прежде чем делать все, чтобы убедиться, что компилятор работает ... Source /opt/intel/compiler/11.1/064/bin/intel64/iccvars_intel64.csh; Source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ... а затем, чтобы скомпилировать: ICC -LTBB TEST.CXX -O TEST

Если нет простого способа реализовать SSE2, любой совет о том, как дополнительно оптимизировать код?

Спасибо, христо

Это было полезно?

Решение

Ваш вопрос представляет некоторую путаницу на то, что происходит. Переменные I, J, K почти наверняка удерживаются в регистрах уже, предполагая, что вы компилируете оптимизацию на (которые должны сделать - добавить «-O2» в свой призыв ICC).

Вы можете использовать asm Блок, но более простые метод, учитывая, что вы уже используете ICC, предназначен для использования внутри SSE. Документация Intel для них здесь - http://www.intel.com/software/products/compilers/clin/docs/ug_cpp /comm1019.htm.

Похоже, вы можете SIMD-IZE петлю верхнего уровня, хотя он будет сильно зависеть от того, что ваш delta Функция есть.

Другие советы

Когда вы хотите использовать язык сборки в модуле C ++, вы можете просто поставить его внутри asm Блокируйте и продолжайте использовать имена переменных снаружи блока. Инструкции по сборке, которые вы используете в пределах asm Блок укажет, на каком регистре и т. Д. работает дальше, но они будут варьироваться от платформы.

Если вы используете GCC, см. http://gcc.gnu.org/projects/tree-ssa/vectionization.html. Для того, как помочь компилятору Auto-векторизировать свой код и примеры.

В противном случае вам необходимо сообщить нам, какую платформу вы используете.

Компилятор должен делать это для вас. Например, в VC ++ вы можете просто включить SSE2.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top