Как сделать расписание openmp более упорядоченным для контрольных точек ⇐ C++

Программы на C++. Форум разработчиков
Anonymous
Как сделать расписание openmp более упорядоченным для контрольных точек

Сообщение Anonymous »

Я пытаюсь выполнить большой цикл в C++ с помощью #pragma omp параллельно.
Мне нужно отслеживать значения индекса диапазона i, которые уже были протестированы (контрольные точки), поскольку задание необходимо будет возобновить, если он прерывается (убивается). (Переделать часть работы можно.) Этот код хорошо работает на моем компьютере с Linux на базе Intel, но на Apple Silicone OpenMP расписание повсюду. См. ниже. Как это можно исправить? Или, может быть, в этом контексте есть более продвинутый метод проверки точек?

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int main() {
omp_set_num_threads(3);
#pragma omp parallel for schedule(dynamic, 100)
for (int i = 0; i < 20000; ++i){
int id=omp_get_thread_num();
//using puts since it is thread safe
if(!(i % 100)) puts((to_string(i)+": id:"+to_string(id)).c_str());
//here instead of actual job, I am creating a tiny random delay
mt19937_64 eng{random_device{}()};  //seed
uniform_int_distribution dist{10, 100};
this_thread::sleep_for(std::chrono::milliseconds{dist(eng)});
}
return 0;
}
Linux с Intel:

Код: Выделить всё

0: id:2
100: id:1
200: id:0
300: id:1
400: id:0
500: id:2
....
Процессор Mac + M3 (с библиотекой Mac openmp и компилятором clang):

Код: Выделить всё

0: id:0
6700: id:1
13400: id:2
100: id:0
6800: id:1
13500: id:2
200: id:0
6900: id:1
Этот график бесполезен для контрольных точек. Я стараюсь избегать статического расписания, поскольку оно неэффективно.

Подробнее здесь: https://stackoverflow.com/questions/789 ... ckpointing

Вернуться в «C++»