Intel - parserplus.comparserplus.com/files/labs/intel_libraries.pdfIntel® Math Kernel Library. •...
Transcript of Intel - parserplus.comparserplus.com/files/labs/intel_libraries.pdfIntel® Math Kernel Library. •...
Высокопроизводительные библиотеки Intel
С.А.Немнюгин
Высокопроизводительные вычисления на GRID системах. Архангельск, 2012
Содержание
• Общая характеристика Intel® Math Kernel Library.
• Состав Intel® Math Kernel Library.
• Общая характеристика и состав Intel® Integrated Performance Primitives.
• Intel® Threading Building Blocks.
Общая характеристикаIntel® Math Kernel libraryIntel® Math Kernel library
Intel® Math Kernel Library (Intel® MKL) – вычислительная математическая
библиотека, содержащая хорошо оптимизированные многопоточные
реализации математических функций. Содержит BLAS, LAPACK,
ScaLAPACK, солверы для разреженных систем, быстрое преобразование
Фурье, векторизованные математические функции и т.д.
Многоплатформенная библиотека, однако ScaLAPACK не поддерживается в
Mac OS* X.
Поддерживаются C и Fortran.Поддерживаются C и Fortran.
Входит в состав следующих пакетов:
• IntelR Parallel Studio XE
• IntelR Cluster Studio XE
• IntelR C++ Studio XE
• IntelR Composer XE
• IntelR C++ Composer XE
• IntelR Fortran Composer XE
Состав Intel® Math Kernel LibraryLibrary
Основные операции с векторами и матрицами:
- BLAS (Basic Linear Algebra Subroutines);
- SparseBLAS (Basic Linear Algebra Subroutines);
- PBLAS (Parallel BLAS).
BLAS – эффективная библиотека, в которой реализованы основные операции:
векторно-векторные (1 уровень), матрично-векторные (2 уровень) и матрично-векторно-векторные (1 уровень), матрично-векторные (2 уровень) и матрично-
матричные (3 уровень). Библиотека оптимизируется под разные архитектуры и
используется в качестве «ядра» других библиотек более высокого уровня).
SparseBLAS – расширение BLAS для работы с разрежёнными векторами и
матрицами.
PBLAS – параллельная реализация BLAS для вычислительных систем с
распределённой памятью. Построена на основе MPI.
Модуль линейной алгебры (решение систем линейных алгебраических
уравнений, решение спектральных задач). Включает следующие
компоненты:
- LAPACK (Linear Algebra PACKage);
-- ScaLAPACK.
LAPACK содержит подпрограммы решения систем линейных
алгебраических уравнений, решения спектральных задач для матриц
(вычисления собственных значений и собственных векторов),
факторизации матриц разного вида (LU, QR, Холецкого, Шура, факторизации матриц разного вида (LU, QR, Холецкого, Шура,
сингулярного и других) и т.д. Процедуры предназначены для работы с
хорошо заполненными и ленточными матрицами, вещественными и
комплексными, в форматах с простой и двойной точностью
(www.netlib.org/lapack).
ScaLAPACK – параллельная библиотека подпрограмм линейной алгебры,
реализованная для систем с распределённой памятью
(www.netlib.org/scalapack).
Модуль линейной алгебры для разрежённых матриц:
- PARDISO (PARallel DIrect SOlver);
- итерационные солверы для разрежённых матриц.
PARDISO – потокобезопасная, эффективная библиотека, предназначенная для
решения систем линейных алгебраических уравнений с большими решения систем линейных алгебраических уравнений с большими
разрежёнными матрицами, как симметричными, так и несимметричными
(www.pardiso-project.org). Подпрограммы библиотеки реализованы как для
систем с общей, так и с распределённой памятью.
Векторные функции:
- VML (Vector Mathematical Library);
- VSL (Vector Statistical Library).
VML – векторные реализации математических функций.
VSL – параллельные (многопоточные) реализации генераторов VSL – параллельные (многопоточные) реализации генераторов
псевдослучайных чисел.
Модуль быстрого преобразования Фурье:
- FFT (Fast Fourier Transform);
- ClusterFFT – кластерная реализация библиотеки быстрого преобразования
Фурье.
Модуль поддержки решения дифференциальных уравнений в частных Модуль поддержки решения дифференциальных уравнений в частных
производных:
- TT (Trigonometric Transforms);
- PL (Poisson Library).
Optimization solvers (метод наименьших квадратов):
BLAS – Basic Linear Algebra SubroutinesSubroutines
BLAS – Basic Linear Algebra Subroutines
Структура:
� 1 уровень: векторно-векторные;
� 2 уровень: матрично-векторные;
� 3 уровень: матрично-матричные.
Форматы хранения матриц:
� плотный – матрица хранится в двумерном массиве;
� упакованный – используется для симметричных или треугольных матриц. Элементы
матрицы хранятся последовательно, по столбцам;
� ленточный - используется для ленточных матриц. Двумерный массив хранит
диагонали матрицы.
Производительность
Производительность
SparseBLASОсновные операции с разрежёнными векторами и матрицами
Структура:
� 1 уровень: операции с разрежёнными векторами;
� 2 уровень: операции с разрежёнными матрицами и плотными векторами;
� 3 уровень: операции с разрежёнными и плотными матрицами.� 3 уровень: операции с разрежёнными и плотными матрицами.
Разнообразные форматы хранения матриц.
Производительность
LAPACK – Linear Algebra PackagePackage
LAPACK – Linear Algebra PACKage
Структура:
� системы линейных алгебраических уравнений: факторизация матриц, решение систем
линейных алгебраических уравнений, оценка обусловленности, уточнение решения и
оценка его погрешности, обращение матриц;
� решение спектральных задач для симметричных и несимметричных матриц, метод � решение спектральных задач для симметричных и несимметричных матриц, метод
наименьших квадратов: ортогональные разложения (QR, LQ), сингулярные
разложения, линейный метод наименьших квадратов, обобщённый метод
наименьших квадратов;
� вспомогательные процедуры.
Производительность
Производительность
Солверы для разреженных системсистем
SS – Sparse Solvers
Солверы для разреженных систем
Прямые солверы
PARDISO (PARallel DIrect Solver) – параллельный прямой солвер.
DSS (Direct Sparse Solver) – солвер разреженных систем, прямой метод.
Итерационные солверы
CG (Conjugate Gradients) – метод сопряжённых градиентов.
FGMRES (Generalized Minimal RESidual) – метод обобщённых минимальных
невязок.
Предобуславливатели
ILUO и ILUT (Incomplete LU).
VML – Vector Mathematical LibraryLibrary
VML – Vector Mathematical Library
Векторизованные математические функции.
Структура
Вещественные функции (неполная выборка):
Тригонометрич Гиперболиче Степени Экспоненциа Спецфунк Арифметиче ОкруглеТригонометрич
еские
Гиперболиче
ские
Степени
и корни
Экспоненциа
льные,
логарифмиче
ские
Спецфунк
ции
Арифметиче
ские
Округле
ние
Sin Sinh Pow2o3 Exp Erf Add Floor
Cos Cosh Pow3o2 Ln Erfc Sub Cell
Tan Tanh Pow Log10 ErfInv Sqr Trunc
Asin Asinh Powx Exm1p ErfcInv Mul Round
Acos Acosh Sqrt Log1p TGamma Abs NearbyInt
Atan Atanh InvSqrt LGamma LinearFrac Rint
Комплексные функции (неполная выборка):
Тригонометрические Гиперболические Степени и
корни
Экспоненциальные,
логарифмические
Арифметические
Sin Sinh Pow Exp Add
Cos Cosh Powx Ln Sub
Tan Tanh Sqrt Log10 Div
Asin Asinh Mul
Acos Acosh Abs
Atan Atanh Conj
Форматы
Вещественный и комплексный, с простой и двойной точностью.
Режимы точности и производительности
Повышенная точность (HA – High Accuracy). Правильное округление выполняется более чем в 99% случаев. Самый медленный режим.
Пониженная точность (LA – Low Accuracy). Неправильными могут быть до Пониженная точность (LA – Low Accuracy). Неправильными могут быть до двух младших (наименее значимых) разрядов. Производительность, по сравнению с режимом высокой точности выше на 30-50%.
Режим улучшенной производительности (EP – Enhanced Performance). Неправильными могут быть до половины двоичных разрядов. Производительность, по сравнению с режимом низкой точности выше на 30-50%.
Библиотека поддерживает динамическое управление точностью.
Формат вызова
Вещественный и комплексный, с простой и двойной точностью.
v(s, d)Exp(n, input_array, output_array)
Функции VML могут вызываться в режиме in-place, когда входной и выходной
массивы занимают одно и то же положение в памяти.массивы занимают одно и то же положение в памяти.
Изменение режима точности
Вызовом
vmlSetMode(VML_EP)
VSL – Vector Statistical LibraryLibrary
VSL – Vector Statistical Library
Векторизованные функции генерации псевдо/квазислучайных чисел,
статистика.
Структура
Генераторы случайных чисел
(равномерное распределение)
Генераторы псевдослучайных чисел
(неравномерное распределение)
Статистика
Псевдослучайные Квазислучайные Непрерывные Дискретные
Мультипликативный
конгруэнтный 59-
разрядный
Соболя Равномерное Равномерное Центральные моменты
до 4-го порядка
включительно
Мультипликативный
конгруэнтный 31-
разрядный
Нидеррайтера Нормальное Бернулли Эксцесс, асимметрия
На сдвиговом
регистре с обратной
связью
Экспоненциально
е
Биномиальное Квантили, порядковые
статистики
Mersenne Twister Коши Гипергеометрическое Матрицы ковариации и
корреляции
Генератор
Wichmann-Hill
Бета Пуассона
Заголовочный файл
#include ”mkl_vsl.h”
Инициализация
status = vslNewStream(&stream, VSL_BRNG_MT19937, SEED)status = vslNewStream(&stream, VSL_BRNG_MT19937, SEED)
Генерация псевдо(квази)случайных значений
status = vdRngUniform(method, stream, vector_size, r, 0.0,
1.0)
Деинициализация
status = vslDeleteStream(&stream)
FFT – Fast Fourier Transform librarylibrary
FFT – Fast Fourier Transform
Быстрое преобразование Фурье
� Размерность: 1, 2, 3 и более.
� Совместимость с FFTW (поддерживаются соответствующие интерфейсы).
� Поддержка многопоточности, архитектур SMP и кластерных.
� Поддержка преобразований со смешанным основанием.� Поддержка преобразований со смешанным основанием.
Производительность
Производительность
Производительность
Производительность
DFL – Data Fitting Library
DFL – Data Fitting Library
Векторизованные функции, предназначенные для фитирования данных.
Структура
Сплайны Тип сплайна Граничные условия Внутренние условия
Линейные 1-я производная
Квадратичные Свободные 2-я производнаяКвадратичные Свободные 2-я производная
Кубические Натуральные,
эрмитовы,
Бесселя, Акимы
1-я производная на
левой/правой
границах интервала
Массив узлов
Кусочно-постоянные Непрерывные
слева,
непрерывные
справа
Периодические
Определённые
пользователем
Производительность
Примеры
Вычисление скалярного произведения
#include <windows.h>
#include <stdio.h>
#include "mkl.h"
#include "gettimeofday.h"
#define N 100000000
double a[N + 1], b[N + 1];
int i;
double gDotProduct = 0;double gDotProduct = 0;
int main()
{
// initialize vectors
for (i = 0; i < N; i++)
{
a[i] = 1.034; b[i] = 1.057;
}
printf("Computed value of vector sum: ");
gDotProduct = cblas_ddot(N, &a, 1, &b, 1);
//print dot product
printf("sum = %f\n", gDotProduct);
}
Вычисление собственных значений
program eigenLAPACK
integer, parameter :: NIN = 5, NOUT = 6
integer :: I, IFAIL, INFO, J, N
character(1) :: UPLO='U'
real, allocatable, dimension(:,:) :: A
real, allocatable, dimension(:) :: D
real, allocatable, dimension(:) :: E, TAU
real, allocatable, dimension(:) :: WORK
real, allocatable, dimension(:,:) :: Z
external f06qfe, sorgtr, ssteqr, ssytrd, x04caeexternal f06qfe, sorgtr, ssteqr, ssytrd, x04cae
write(NOUT, *) 'N=?'
read(NIN,*) N
allocate(D(N))
LWORK = 64 * N
allocate(WORK(LWORK))
allocate(E(N-1))
allocate(TAU(N-1))
LDA = N
allocate(A(LDA, N))
LDZ = N
allocate(Z(LDZ, N))
allocate(TAU(N-1))
LDA = N
allocate(A(LDA, N))
LDZ = N
allocate(Z(LDZ, N))
!
! Initialization of upper triangular part of A
!
do i=1, N
do j=i, N
a(i, j)=3.8*i-2.*j
enddo
enddo
!
! Reduce A to tridiagonal form
!
call ssytrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
!
! Copy A into Z
!
call f06qfe(UPLO, N, N, A, LDA, Z, LDZ)
!
! Form Q explicitly, storing the result in Z
!
call sorgtr(UPLO, N, Z, LDZ, TAU, WORK, LWORK, INFO)
!
! Calculate all the eigenvalues and eigenvectors of A
!
call ssteqr('V', N, D, E, Z, LDZ, WORK, INFO)
write(NOUT,*)
if(INFO >0) then
write(NOUT,*) 'Failure to converge.'
else
!
! Uncomment to print eigenvalues and eigenvectors
!
!write(NOUT,*) 'Eigenvalues'
!write(NOUT, "(3X,(8F12.4))") (D(I),I=1,N)
!IFAIL = 0
!
!call x04cae('General', ' ', N, N, Z, LDZ, 'Eigenvectors',
IFAIL)IFAIL)
end if
deallocate(D)
deallocate(WORK)
deallocate(E)
deallocate(TAU)
deallocate(A)
deallocate(Z)
end
Метод Монте-Карло
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <omp.h>
#include <time.h>
#include <iostream>
#include <mkl_vsl.h>
#define BRNG VSL_BRNG_MCG31
#define METHOD 0
#define BLOCK_SIZE 1000#define BLOCK_SIZE 1000
using namespace std;
const int SamplingSize = 1000;
const int ChainLength = 1000;
int N;
…
void setComponentChain(double * P[],int Chain[],int Component,
int last[]){
Chain[0] = Component;
double r;
double rand[BLOCK_SIZE];
VSLStreamStatePtr stream;
vslNewStream(&stream, BRNG, (int) clock());
vdRngUniform(METHOD, stream, BLOCK_SIZE, &r, 0.0, 1.0);
int state = Chain[0];
int steps = 0;
for(int i = 1; i < ChainLength; i++){
if (state!= N - 1){
r = rand[i];r = rand[i];
if (r > 0.0){
double sum = 0.0;
for(int j = 0; j < N; j++){
sum += P[state][j];
if (r <= sum){
state = j;
Chain[i] = state;
break;
}
}
}
else if (r == 1.0){
last[0] = i;
Chain[i] = N-1;
break;
}
if(Chain[i] < 0 || Chain[i] > N-1){
last[0] = i;
break;
}
}
else{
last[0] = i;
break;break;
}
}
vslDeleteStream( &stream );
}
Общая характеристика и состав Intel® Integrated Performance PrimitivesPerformance Primitives
Intel ® Integrated Performance Primitives
Библиотека готовых компонентов для разработки мультимедийных приложений для вычислительных платформ Intel.
Включает модули для обработки сигналов и выполнения векторных и матричных операций (эффективна при работе с маленькими матрицами), функции сжатия и распаковки речи и статических/динамических изображений, средства шифрования и обработки аудиоданных и текстовых строк.
Intel IPP обеспечивает прозрачное использование расширенных возможностей Intel IPP обеспечивает прозрачное использование расширенных возможностей процессоров Intel, таких, как технология MMX, расширения набора команд Streaming SIMD Extensions и Streaming SIMD Extensions.
Библиотека Intel IPP оптимизирована для работы с разными процессорами Intel.
Библиотека Intel IPP поддерживает 32- и 64-битные операционные системы Windows и Linux, включая встраиваемые версии, такие как Windows Mobile.
Intel ® Integrated Performance Primitives
Состав:
• Функции размещения и освобождения памяти.
• Вспомогательные функции – определение числа ядер, типа процессора, выравнивание указателей, определение числа потоков и т.д.
• Функции диспетчеризации.
• Функции инициализации векторов.
• Генерация сигналов разного типа.
• Генераторы однородного и неоднородных распределений.
• Логические, арифметические функции, функции преобразования векторов • Логические, арифметические функции, функции преобразования векторов (сортировка, преобразование типов, объединение векторов, комплексное сопряжение и др.).
• Работа с окнами (обработка сигналов).
• Статистические функции.
• Функции фильтрации.
• Преобразования: FFT, Харли, Гильберта, Уолша-Адамара, вейвлетное.
• Функции распознавания и кодирования речи.
• Работа со строками.
• Элементарные и специальные математические функции.
• Сжатие данных и т.д.
Пример. Скалярное произведение
#include <windows.h>
#include <stdio.h>
#define N 100000000
#include "ipps.h"
Ipp64f a[N + 1], b[N + 1];
int i;
double gDotProduct = 0;
int main()int main()
{
// initialize vectors
for (i = 0; i < N; i++)
{
a[i] = 1.034; b[i] = 1.057;
}
printf("Computed value of vector sum: ");
ippsDotProd_64f(a, b, (N + 1), &gDotProduct);
//print dot product
printf("sum = %f\n", gDotProduct);
}
Пример. Умножение матриц
#include <stdio.h>
#include "gettimeofday.h“
#define NUM 2025
#include "ippm.h"
int main()
{
int i, j;
/* Matrix with width=4 and height=3 */
static Ipp64f a[NUM * NUM];static Ipp64f a[NUM * NUM];
int aWidth = NUM;
int aHeight = NUM;
int aStride2 = sizeof(Ipp64f);
int aStride1 = NUM*sizeof(Ipp64f);
/* Matrix with width=height=NUM */
static Ipp64f b[NUM * NUM];
int bWidth = NUM;
int bHeight = NUM;
int bStride2 = sizeof(Ipp64f);
int bStride1 = NUM*sizeof(Ipp64f);
/* Destination matrix has width=height=NUM */
static Ipp64f c[NUM * NUM];
int cStride2 = sizeof(Ipp64f);
int cStride1 = NUM*sizeof(Ipp64f);
for (i=0; i< NUM;i++) {
for (j=0; j<NUM;j++) {
a[i * NUM + j] = 3 * i - 2 * j + 1;
b[i * NUM + j] = -2 * i + 1 * j + 3;
}
}
printf("NUM:%d\n",NUM);
ippmMul_mm_64f((Ipp64f*)a, aStride1, aStride2, aWidth, aHeight, (Ipp64f*)b,
bStride1, bStride2, bWidth, bHeight, c, cStride1, cStride2);
}
Пример. Вычисление собственных значений
#include <stdio.h>
#include "ippm.h"
#include "ippcore.h“
#define NUM 200
void printf_va_Ipp32f(const char* msg, Ipp32f* buf,
int length, int count, IppStatus st )
{ int i, j;
if( st < ippStsNoErr ) {
printf( "Error %d, %s\n", st, ippGetStatusString( st )); printf( "Error %d, %s\n", st, ippGetStatusString( st ));
}
else
{
printf("%s \n", msg );
for( j=0; j < count; j++) {
for( i=0; i < length; i++) {
printf("%f ", buf[j*length+i]); }
printf("\n"); } }
}
void printf_m_Ipp32f(const char* msg, Ipp32f* buf,
int width, int height, IppStatus st )
{ int i, j;
if( st < ippStsNoErr ) {
printf( "Error %d, %s\n", st, ippGetStatusString( st ));
}
else
{
printf("%s \n", msg );
for( j=0; j < height; j++) {
for( i=0; i < width; i++) {
printf("%f ", buf[j*width+i]); }
printf("\n"); } } printf("\n"); } }
}
static double a[NUM*NUM];
//routine to initialize symmteric matrix
void init_arr(double row, double col, Ipp32f a[])
{
int i,j;
for (i=0; i< NUM;i++) {
for (j=0; j<i+1;j++) {
a[i*NUM+j] = row*i+col*j;
a[j*NUM+i] = a[i*NUM+j];
}}}
int main()
{
int i, j;
double start, stop;
/* Source matrix with width=4 and height=4 */
Ipp32f pSrc[NUM*NUM];
int srcStride2 = sizeof(Ipp32f);
int srcStride1 = NUM*sizeof(Ipp32f);
Ipp32f pBuffer[NUM*NUM]; /* Buffer location */
int widthHeight = NUM;
Ipp32f pDstValues[NUM]; /* Eigenvalues location */
Ipp32f pDstVectors[NUM*NUM]; /* Eigenvectors location */
int dstStride2 = sizeof(Ipp32f);int dstStride2 = sizeof(Ipp32f);
int dstStride1 = NUM*sizeof(Ipp32f);
// initialize the arrays with data
init_arr(3,-2,pSrc);
start = wcgettimeofday();
IppStatus status=ippmEigenValuesVectorsSym_m_32f((const Ipp32f*)pSrc,
srcStride1, srcStride2, pBuffer, pDstVectors, dstStride1, dstStride2, pDstValues, widthHeight);
if (status == ippStsNoErr) {
printf("Computation done\n");
//printf_va_Ipp32f("Eigenvalues:", pDstValues, NUM, 1, status);
//printf_m_Ipp32f("Eigenvectors :", pDstVectors, NUM, NUM, status);
}
else
{
printf("Function returns status: %s \n", ippGetStatusString(status));
}
}
Intel® Threading Building BlocksBlocks
Intel ® Threading Building Blocks
Библиотека готовых шаблонов C++, упрощающая разработку многопоточных приложений, обеспечивая более высокий уровень абстракции при распараллеливании.
Многоплатформенность: Linux, Microsoft Windows, Mac OS.
Если код написан на языке C++, лучше Intel® TBB.
Intel® TBB хорошо подходит, если код в значительной степени объектно-ориентирован и в нем широко используются шаблоны C++ и определяемые пользователем типы. ориентирован и в нем широко используются шаблоны C++ и определяемые пользователем типы.
Если код написан на C или Fortran, лучше выбрать OpenMP, поскольку этот API лучше соответствует стилю структурного программирования.
При использовании C++, если в программе преобладают операции обработки массивов, OpenMP может оказаться удобнее с точки зрения сложности программирования.
Диспетчер задачtask_group, structured_task_grouptasktask_scheduler_init
Concurrent Containersconcurrent_hash_mapconcurrent_unordered_{map,set}concurrent_[bounded_]queueconcurrent_priority_queueconcurrent_vector
Thread Local Storage
Параллельные алгоритмыparallel_forparallel_for_eachparallel_invokeparallel_doparallel_scanparallel_sortparallel_[deterministic]_reduce
Macro Dataflowparallel_pipelinetbb::flow::...
61
Примитивы синхронизацииatomic, condition_variable[recursive_]mutex{spin,queuing,null} [_rw]_mutexcritical_section, reader_writer_lock
task_scheduler_inittask_scheduler_observer
Размещение памятиtbb_allocatorzero_allocatorcache_aligned_allocatorscalable_allocator
combinableenumerable_thread_specific
Потокиstd::thread
Шаблоны параллельного программированияНе удается отобразить рисунок. Возможно, рисунок поврежден или недостаточно памяти для его открытия. Перезагрузите компьютер, а затем снова откройте файл. Если вместо рисунка все еще отображается красный крестик, попробуйте удалить рисунок и вставить его заново.
62
• Большая часть public TBB имён находится в пространстве имён
tbb
• C++11 names are in namespace std.
#include "tbb/tbb.h"
using namespace tbb;
#include "tbb/compat/condition_variable"
63
#include "tbb/compat/condition_variable"
#include "tbb/compat/thread"
#include "tbb/compat/tuple"
Пример использования.
Распараллеливание цикла:
void SerialApplyFoo( float a[], size_t n ) {
for( size_t i=0; i!=n; ++i )
Foo(a[i]);
}
#include "tbb/tbb.h"
using namespace tbb;
class ApplyFoo {
float *const my_a;
public:
void operator()( const blocked_range<size_t>& r ) const {
float *a = my_a;
for( size_t i=r.begin(); i!=r.end(); ++i )
Foo(a[i]);
}
ApplyFoo( float a[] ) :ApplyFoo( float a[] ) :
my_a(a)
{}
};
Редуктор enumerable_thread_specific
• Используется, если:
– операция коммутативна;
– тип операнда «большой».
enumerable_thread_specific<BigMatrix> sum;
...
Контейнер элементов, локальных по
отношению к потоку
66
parallel_for( 0, n, [&]( int i ) {
sum.local() += a[i];
});
... = sum.combine(std::plus<BigMatrix>());
Получение локального по отношению к потоку
элемента sum.
Возвращает результат редукции относительно элементов, локальных по отношению к потоку
Редуктор parallel_reduce
• Используется, если:
– операция некоммутативна;
– для производительности важна «фрагментация».
sum = parallel_reduce(
blocked_range<int>(0,n),
0.f,
[&](blocked_range<int> r, T s) -> float
Начальное значение
67
[&](blocked_range<int> r, T s) -> float
{
for( int i=r.begin(); i!=r.end(); ++i )
s += a[i];
return s;
},
std::plus<T>()
);Объединение результатов
по подинтервалам
Редукция по подинтервалу
Должно быть задано начальное значение для редукции подинтервала
r.
Дерево редукции
0 0 0 0
68
0 0
Цепная редукция
parallel_deterministic reduce
sum = parallel_deterministic_reduce (
blocked_range<int>(0,n,10000),
0.f,
[&](blocked_range<int> r, T s) -> float
Параметр зернистости
(по умолчанию 1)
69
[&](blocked_range<int> r, T s) -> float
{
for( int i=r.begin(); i!=r.end(); ++i )
s += a[i];
return s;
},
std::plus<T>()
);