Мне нужно отслеживать значения индекса диапазона 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;
}
Код: Выделить всё
0: id:2
100: id:1
200: id:0
300: id:1
400: id:0
500: id:2
....
Код: Выделить всё
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