Автоматический- параллелизма и Автоматическое - Vectorization
Автоматический - Parallelizer и автоматический - Vectorizer разработка, чтобы предоставлять автоматические преимущество в производительности для циклов в коде.
Автоматический-Parallelizer
Параметр компилятора /Qpar позволяет автоматическую параллелизацию циклов в коде.При определении этот флажок без внесения изменений в существующий код, компилятор вычисляет код, чтобы найти циклы, которые можно получить выгоду параллелизации.Поскольку это может найти циклы, не имеющих много функций и поэтому не имеют преимущества параллелизации, поскольку каждая необязательная параллелизма может осуществляться порождать пула потоков, дополнительной синхронизации или другого обработки, клонило бы уменьшение производительности вместо повышения его, компилятор консервативн при выборке циклы, которые она выполняет параллелизацию.Например, рассмотрим следующий пример, в котором верхняя граница цикла не известны во время компиляции.
void loop_test(int u) {
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Поскольку u может быть низким значением, компилятор автоматически не выполняет параллелизацию этот цикл.При этом по-прежнему могут потребоваться его параллелизировали, поскольку известно, что объект u будет велико.Чтобы включить автоматически параллелизацию укажите цикл #pragma (hint_parallel (n), где n - количество потоков, подлежащих параллелизации поперек.В следующем примере, компилятор попытается параллелизации цикла по 8 потоков.
void loop_test(int u) {
#pragma loop(hint_parallel(8))
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Как и все директива pragma, другой синтаксис директивы __pragma(loop(hint_parallel(n))) также поддерживается.
Некоторые циклы, компилятор не может параллельно, даже если требуется их.Ниже приведен пример:
#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
A[i] = B[i] * C[i];
Функция The upper_bound() могут изменяться каждый раз, когда она вызывает.Поскольку верхней границы не знать, компилятор может вывести диагностическое сообщение, почему не может параллельно этот цикл.В следующем примере демонстрируется цикл, можно параллельно, цикл, нельзя параллельно, синтаксис компилятора для использования в командной строке компилятора и выходных данных для каждого параметра командной строки.
int A[1000];
void test() {
#pragma loop(hint_parallel(0))
for (int i=0; i<1000; ++i) {
A[i] = A[i] + 1;
}
for (int i=1000; i<2000; ++i) {
A[i] = A[i] + 1;
}
}
Компилировать с помощью этой команды.
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1
создает этот результат.
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
Компилировать с помощью этой команды.
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2
создает этот результат.
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'
Обратите внимание на разницу в выходных 2 между различными параметрами /Qpar-report (Auto-Parallelizer Reporting Level)./Qpar-report:1 выводит сообщения parallelizer только для циклов, успешно параллелизированы./Qpar-report:2 выводит сообщения parallelizer и для успешных и параллелизаций неудачного цикла.
Дополнительные сведения о кодах причины и сообщениях см. в разделе Vectorizer and Parallelizer Messages.
Автоматический-Vectorizer
Автоматическое - Vectorizer анализирует циклов в коде и использует регистры и инструкции вектора в компьютере выполнить их, если оно может.Это может повысить производительность кода.Компилятор на которую нацелен SSE2 в инструкции Intel или AMD, или НЕОНОВЫЕ инструкции для процессоров ARM.Автоматическое - Vectorizer также использует новую SSE4.2 набор инструкций, если на компьютер поддержки его.
По умолчанию автоматическое - Vectorizer включено.Если требуется сравнить производительность кода в vectorization, то с помощью цикл #pragma (no_vector) можно отключить vectorization любого заданного цикла.
#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
A[i] = B[i] + C[i];
Как и все директива pragma, другой синтаксис директивы __pragma(loop(no_vector)) также поддерживается.
Как и в случае с автоматическим - Parallelizer можно указать параметр командной строки /Qvec-report (Auto-Vectorizer Reporting Level) уведомить этого успешно vectorized циклы только /Qvec-report:1— и успешно или неудачно и vectorized петли /Qvec-report:2).
Дополнительные сведения о кодах причины и сообщениях см. в разделе Vectorizer and Parallelizer Messages.
Пример, показывающий, как vectorizer работает на практике см. в разделе Часть 2 Остина проекта 6: Завивать страницы
См. также
Ссылки
/Qpar (автоматический параллелизатор)
/Qpar-report (Auto-Parallelizer Reporting Level)
/Qvec-report (Auto-Vectorizer Reporting Level)