const int SIZE = 10000000;
// Класс-обработchик
class CalculationTask
{
vector &myArray;
public:
// Оператор () выполнyaетсya над диапазоном из пространства итераtsий
void operator()(const tbb::blocked_range &r) const
{
for (int i = r.begin(); i != r.end(); i++)
Calculate(myArray[i]);
}
// Конструктор
CalculationTask (vector &a) : myArray(a) { }
};
int main()
{
vector myArray(SIZE);
// Запуск параллельного алгоритма for
tbb::parallel_for(tbb::blocked_range(0, SIZE), CalculationTask(myArray));
return 0;
}
С использованием лyaмбда-функtsий из С++11:
// Подклюchаютсya необходимые заголовоchные файлы
#include “tbb/blocked_range.h”
#include “tbb/parallel_for.h”
#include
// Колиchество элементов вектора
const size_t SIZE = 10000000;
int main()
{
std::vector myArray(SIZE);
// Запуск параллельного алгоритма for
tbb::parallel_for(tbb::blocked_range(0, SIZE),
// Лyaмбда-функtsиya
[&myArray](const tbb::blocked_range &r)
{
for (size_t i = r.begin(); i != r.end(); i++)
Calculate(myArray[i]);
});
return 0;
}
Intel thread building block kutubxonasini qo’llagan xolda sikllarni matritsali vektorli ko’paytma ko’rinishidagi misollarni ko’rib chiqamiz. Bunday misollarni yechishni birinchi bor 1969 yilda Stranser topmonidan yaratilgan. Ushbu holatni dasturlash muhitida ko’rib chiqamiz.
strassen_mult_par (Strassen parallel)
void strassen_mult_par (
// A, B va C lar submatritsaning qiymatlari
int n,
// (ax,ay) = multiplicand uchun submatrix kelib chiqishi
double *A, int ax, int ay, int as,
// (bx,by) = origin of B submatrix for multiplicand
double *B, int bx, int by, int bs,
// (cx,cy) = origin of C submatrix for result
double *C, int cx, int cy, int cs,
// current depth of Strassen's recursion
int d,
// Strassen's recursion limit for array dimensions
int s
)
{
StrassenMultiply& t = *new (tbb::task::allocate_root ( ))
StrassenMultiply (n, A, ax, ay, as,
B, bx, by, bs,
C, cx, cy, cs, d, s);
tbb::task::spawn_root_and_wait (t);
}
Do'stlaringiz bilan baham: |