Нет.Невозможно отменить упорядоченный цикл.
Отменяемая конструкция цикла не должна иметь упорядоченного предложения.
(см. 2.14.1 OpenMPстандарт)
Одним из способов эмуляции отмены является добавление пропуска в начале цикла, например,
#pragma omp parallel for ordered schedule(dynamic) shared(prime_counter)
for (candidate = start; candidate <= end; candidate += 2) {
if (prime_counter >= max_primes) {
continue;
}
if (is_prime(candidate)) {
Однако это еще не потокобезопасный доступ к prime_counter
.Чтобы избежать условий гонки, вы должны сделать что-то вроде:
int local_prime_counter;
#pragma omp atomic read
local_prime_counter = prime_counter;
if (local_prime_counter >= max_primes)
...
#pragma omp atomic update
prime_counter++;
PS. Я не совсем уверен на 100%, соответствует ли стандарт условной конструкции ordered
.