Загрузка типа static
Вся совокупность загружаемых процессов разбивается на равные порции размера chunk, и эти порции последовательно распределяются между процессорами (или потоками, которые затем и выполняются на этих процессорах) с первого до последнего и т. д.
Ниже приведен пример выполняющий вычисление сумм строк двумерного массива. Причем будет использовано блочно-циклическое распределение итераций по две итерации в блоке. Относительно внутреннего цикла никаких указаний нет, поэтому он будет выполняться последовательно каждой нитью.
void TestSchedule()
{
array<int^>^ a = gcnew array<int^>(10);
array<int^,2>^ b = gcnew array<int^,2>(10,10);
int i=0, j= 0;
#pragma omp parallel default(shared) private(i,j)
{
#pragma omp for
for (i = 0; i < 10; i++)
a[i] = (Int32)0;
#pragma omp for
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
b[i,j] = i+j;
#pragma omp single
for (i = 0; i < 10; i++)
{
for(j = 0; j<10; j++)
{
printf("b[%d,%d] = %d\t ", i, j, (int)b[i,j]);
}
printf("\n");
}
#pragma omp for schedule(static,2)
for (i = 0; i < 10; i++)
for(j=0; j < 10; j++)
a[i] = (int)a[i] + (int)b[i,j];
} //end of region
for (i = 0; i < 10; i++)
printf_s("a[%d] = %d\n", i, (int)a[i]);
}
На схеме (рис.2.2.2.1) показано распределение загрузки процессов по процессорам (или потокам (threads), которые затем выполняются на процессорах) для обработки 12000 элементов массива. Число нитей 4. Как видно из этой схемы, все 12000 процессов разбиты на 12 порций по 1000 процессов (chunk=1000).
Загрузка порций в потоки (threads) происходит последовательно. Сначала порции в порядке нумерации загружаются в первый, второй, третий и четвертый потоки, а затем загрузка производится опять в том же порядке, начиная с первого потока и т. д.
Рис. 2.2.2.1. Схема загрузки процессоров
Дата добавления: 2015-02-03; просмотров: 855;