Я относительно новичок в параллельном программировании и хочу выполнить следующую задачу в c ++ с помощью openmp.
У меня есть несколько (скажем, 4) относительных сложных объектов / вычислений.Все они похожи, но слишком сложны, чтобы распараллелить каждый из них (поэтому они запускаются последовательно).Поэтому моя идея заключалась в том, чтобы использовать разные потоки / процессоры для каждого из них, то есть я хочу распределить вычисления по моим ядрам.Хотя это может быть не самым эффективным использованием параллелизма в этом контексте, его может быть проще всего достичь (из-за высокой сложности каждого вычисления).
Хотя это будет работать
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
Я хочу обмениваться дополнительной информацией между этими объектами, например, целое число (или более сложный объект) «а» следует изменять во время каждого вычисления (хотя я не могу предсказать, когда и как часто, но особенно чаще, чем один раз).Если он изменен, информация также должна быть включена в расчеты друг друга.В то время как конкретный обмен информацией (опять же) является относительно сложным, это делается также и методами «вычисления» (неявно).В общем случае это должно выглядеть так, как указано выше, с дополнительным целым числом «a», которое записывается и читается всеми методами расчета:
int a;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
Итак, мой вопрос: как я могу предотвратить данные?гонка "на" а "?Имеется в виду, как я могу сгенерировать объект, к которому каждый раз может обращаться только один поток, не вдаваясь в детали самих методов «вычисления»?Предлагает ли openmp такую функциональность, а если нет, то какая библиотека это делает?
С наилучшими пожеланиями и заранее спасибо!