--------------------- EDIT ------------------ -------OpenMP: прагма отменить для ON NUMA
Я редактировал код следующим образом:
#pragma omp parallel for private(i, piold, err) shared(threshold_err) reduction(+:pi) schedule (static)
{
for (i = 0; i < 10000000000; i++){ //1000000000//705035067
piold = pi;
pi += (((i&1) == false) ? 1.0 : -1.0)/(2*i+1);
err = fabs(pi-piold);
if (err < threshold_err){
#pragma omp cancel for
}
}
}
pi = 4*pi;
я скомпилировать его с LLVM3.9/Clang4.0. Когда я запускаю его с помощью одного потока, я получаю ожидаемые результаты с действием отмены прагмы (проверяется на вариант отмены без прагмы, что приводит к более быстрому запуску).
Но когда я запускаю его с потоками> = 2, программа переходит в цикл. Я запускаю код на машинах NUMA. Что происходит? Возможно, условие отмены не выполняется! Но тогда код занимает больше времени, чем однопоточная версия без прагмы-отмены! FYI, он запускает файл, когда OMP_CANCELLATION = false.
У меня есть код OpenMP. Я использую LLVM-3.9/Clang-4.0 для компиляции этого кода.
#pragma omp parallel private(i, piold, err) shared(pi, threshold_err)
{
#pragma omp for reduction(+:pi) schedule (static)
for (i = 0; i < 10000000 ; i++){
piold = pi;
pi += (((i&1) == false) ? 1.0 : -1.0)/(2*i+1);
#pragma omp critical
{
err = fabs(pi-piold);// printf("Err: %0.11f\n", err);
}
if (err < threshold_err){
printf("Cancelling!\n");
#pragma omp cancel for
}
}
}
К сожалению, я не думаю, что #pragma omp cancel for
завершает весь цикл for
. Я печатаю значение err
в конце, но опять же с параллелизмом он вводит в заблуждение, какое значение печатается. Конечное значение err
меньше, чем threshold_err
. Отмена печати печатается, но в самом начале программы, что удивительно. После этого программа продолжает работать!
Как убедиться, что это правильная реализация? BTW OMP_CANCELLATION устанавливается в true, а небольшая программа-тест возвращает «1» для соответствующей функции omp_get_cancellation().
привет спасибо за ответ. Что такое cancelFre? – algoProg
Кроме того, когда я удаляю часть цикла 'cancel for', код занимает ~ 11 секунд с' i = 100000000'. Но с 'cancel for' в нем требуется навсегда, что я должен прервать его. – algoProg
@algoProg ОтменаFre - частота смены канала, я ставлю это прямо после ompcancel, чтобы подсчитать, сколько раз передается сигнал отмены (так что я знаю, что это всего лишь сигнал в конце концов). Я уверен, что смогу пройти цикл. Я также подтверждаю, что на моем ноутбуке работает ваш код. Я просто вижу, что вы разделяете довольно много переменных. –