Расписание OpenMP (статическое) без указания размера чанка: размер чанка и порядок назначения
У меня есть несколько вопросов относительно#pragma omp for schedule(static)
где размер чанка не указан.
Один из способов распараллеливания цикла в OpenMP состоит в том, чтобы сделать это вручную следующим образом:
#pragma omp parallel
{
const int nthreads = omp_get_num_threads();
const int ithread = omp_get_thread_num();
const int start = ithread*N/nthreads;
const int finish = (ithread+1)*N/nthreads;
for(int i = start; i<finish; i++) {
//
}
}
Есть ли веская причина не делать параллельное параллельное выполнение цикла в OpenMP? Если я сравню значения с#pragma omp for schedule(static)
Я вижу, что размеры порций для данного потока не всегда совпадают, поэтому OpenMP (в GCC) реализует размеры порций, отличные от определенных вstart
а такжеfinish
, Почему это?
start
а такжеfinish
определенные мной значения имеют несколько удобных свойств.
Редактировать: В оригинале я сказал ровно один чанк, но подумав об этом, размер чанка может быть равен нулю, если число потоков намного больше, чемN
(ithread*N/nthreads = (ithread*1)*N/nthreads
). Свойство, которое я действительно хочу, это максимум один кусок.
Все эти свойства гарантированы при использовании#pragma omp for schedule(static)
?
Согласно спецификациям OpenMP:
Программы, которые зависят от того, какой поток выполняет конкретную итерацию при любых других обстоятельствах, не соответствуют требованиям.
а также
Различные области цикла с одинаковым расписанием и количеством итераций, даже если они находятся в одной параллельной области, могут по-разному распределять итерации между потоками. Единственное исключение длястатический график
Заschedule(static)
спецификация гласит:
порции назначаются потокам в команде в циклическом порядке в порядке номера потока.
Кроме того, в спецификации сказано: `schedule (static):
Когда chunk_size не указан, пространство итерации делится на порции, которые приблизительно равны по размеру, и не более одного порция распределяется по каждому потоку.
Наконец, в спецификации сказано:schedule(static)
:
Совместимая реализация статического расписания должна гарантировать, что одинаковое назначение номеров логических итераций для потоков будет использоваться в двух областях цикла, если выполняются следующие условия: 1) обе области цикла имеют одинаковое количество итераций цикла, 2) оба цикла области имеют одинаковое значение, указанное в chunk_size, или в обеих областях цикла не указано chunk_size, 3) обе области цикла связаны с одной и той же параллельной областью
Так что, если я правильно прочиталschedule(static)
будет иметь те же удобные свойства, которые я перечислил какstart
а такжеfinish
хотя мой код полагается на поток, выполняет определенную итерацию.Я правильно интерпретирую это? Кажется, это особый случай дляschedule(static)
когда размер чанка не указан.
Проще определитьstart
а такжеfinish
как я тогда попытался прервать спецификацию для этого случая.