Расписание 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 определенные мной значения имеют несколько удобных свойств.

Каждый поток получает не более одного куска.Диапазон значений для итераций увеличивается непосредственно с номером потока (то есть для 100 потоков с двумя потоками первый поток будет обрабатывать итерации 1-50, а второй поток 51-100, а не наоборот).Для двух циклов for в одном и том же диапазоне каждый поток будет проходить одинаковые итерации.

Редактировать: В оригинале я сказал ровно один чанк, но подумав об этом, размер чанка может быть равен нулю, если число потоков намного больше, чем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 как я тогда попытался прервать спецификацию для этого случая.

Ответы на вопрос(1)

Ваш ответ на вопрос