Итак, вот код:
#pragma omp parallel private (myId)
{
set_affinity();
myId = omp_get_thread_num();
if (myId<myConstant)
{
#pragma omp for schedule(static,1)
for(count = 0; count < AnotherConstant; count++)
{
//Do stuff, everything runs as it should
}
}
#pragma omp barrier //all threads wait as they should
#pragma omp single
{
//everything in here is executed by one thread as it should be
}
#pragma omp barrier //this is the barrier in which threads run ahead
par_time(cc_time_tot, phi_time_tot, psi_time_tot);
#pragma omp barrier
}
//do more stuff
Теперь объясним, что происходит.В начале моей параллельной области myId установлен в private, так что каждый поток имеет свой правильный идентификатор потока.set_affinity () контролирует, какой поток работает на каком ядре.Проблема, с которой я сталкиваюсь, связана с #pragma omp для расписания (static, 1).
блок:
if (myId<myConstant)
{
#pragma omp for schedule(static,1)
for(count = 0; count < AnotherConstant; count++)
{
//Do stuff, everything runs as it should
}
}
Представляет некоторую работу, которую я хочу распределить по определенному количеству потоков, от 0 до myConstant-1.В этих потоках я хочу равномерно (в соответствии с графиком (static, 1)) распределить итерации цикла.Это все выполняется правильно.
Затем код входит в одну область, все команды там выполняются в порядке.Но, скажем, я указываю myConstant равным 2. Тогда, если я запускаю с 3 потоками или более, все в одном материале выполняется правильно, но потоки с идентификатором 3 или выше не ожидают завершения всех команд в одном.
В пределах одного вызывается несколько функций, которые создают задачи, которые выполняются всеми потоками.Потоки с идентификатором 3 или более (обычно myConstant или более) продолжаются, выполняя par_time (), в то время как другие потоки все еще выполняют задачи, созданные функциями, выполняемыми в сингле.par_time () просто печатает некоторые данные для каждого потока.
Если я закомментирую прагму omp для расписания (static, 1) и просто заставлю один поток выполнить цикл for (например, сменим оператор if на if (myId == 0)), тогда все будет работать.Так что я просто не уверен, почему вышеупомянутые темы продолжаются.
Дайте мне знать, если что-то сбивает с толку, это своего рода конкретная проблема.Я искал, чтобы увидеть, видел ли кто-нибудь недостаток в моем контроле потока с OMP.