gpt4 book ai didi

c - 有没有办法从内部有序子句中取消?

转载 作者:行者123 更新时间:2023-11-30 14:38:45 25 4
gpt4 key购买 nike

我正在开发一个程序,该程序使用多个线程计算一定数量的素数。现在我遇到了在所述素数之后退出线程的问题。

我已经尝试过#pragma omp cancel for,但我无法在有序子句中使用它。还有另一种方法可以“打破”循环吗?

void get_primes(prime_type start, prime_type end) {
#pragma omp parallel for ordered schedule(dynamic) shared(prime_counter)
for (candidate = start; candidate <= end; candidate += 2) {
if (is_prime(candidate)) {
#pragma omp ordered
{
primes[prime_counter] = candidate;
prime_counter++;
if (prime_counter >= max_primes) {
#pragma omp cancel for
}
#pragma omp cancellation point for
}
}
}
}

当我找到所需数量的素数时,我想立即“打破”循环,如果我没有记错的话,这必须在有序子句内完成。

最佳答案

没有。无法取消有序循环。

A loop construct that is canceled must not have an ordered clause.

(参见 OpenMP 标准的 2.14.1)

模拟取消的解决方法之一是在循环开头添加跳过,例如

#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++;

附注我不太 100% 确定条件 ordered 构造是否符合标准。

关于c - 有没有办法从内部有序子句中取消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com