Intel Параллельная Студия 2011 - параллельное суммирование
У меня есть серийный код, который выглядит примерно так:
sum = a;
sum += b;
sum += c;
sum += d;
Я хотел бы распараллелить это что-то вроде этого:
temp1 = a + b and in the same time temp2 = c + d
sum = temp1 + temp2
Как мне сделать это с помощью инструментов Intel для параллельной студии?
Спасибо!!!
1 ответ
Предполагая, что все переменные имеют целочисленные типы или типы с плавающей запятой, нет абсолютно никакого смысла распараллеливать этот код (в смысле выполнения различными потоками / ядрами), так как издержки будут намного выше, чем любая польза от него. Применимый параллелизм в этом примере находится на уровне нескольких вычислительных блоков и / или векторизации на одном CPU. Оптимизирующие компиляторы в настоящее время достаточно сложны, чтобы использовать это автоматически, без изменений кода; однако, если вы хотите, вы можете явно использовать временные переменные, как во второй части вопроса.
И если вы спросите просто из любопытства: Intel Parallel Studio предлагает несколько способов распараллеливания кода. Например, давайте использовать ключевые слова Cilk вместе с лямбда-функциями C++11:
#include <cilk/cilk.h>
...
temp = cilk_spawn [=]{ return a+b; }();
sum = c+d;
cilk_sync;
sum += temp;
Не ожидайте от этого повышения производительности (см. Выше), если только вы не используете классы с перегруженной вычислительными возможностями operator+
,