c++ - OpenMP:如何刷新指针目标?

标签 c++ pointers reference openmp flush

我刚刚注意到以下代码无法在 OpenMP(在 GCC 4.5.1 下)中编译:

struct job {
    unsigned busy_children;
};

job* j = allocateJob(…);
// …

#pragma omp flush(j->busy_children)

编译器提示参数列表中的 -> 需要刷新,根据 OpenMP 规范,这是正确的:flush 期望参数列表为“id- expression”s,这基本上意味着只允许(合格的)ID,不允许表达式。

此外,规范对 flush 和指针进行了说明:

If a pointer is present in the list, the pointer itself is flushed, not the memory block to which the pointer refers.

当然。但是,由于 OpenMP 也不允许我取消引用指针,所以我基本上无法刷新指针对象(指针目标)。

——那么引用文献呢?规范没有提到它们,但我不确定以下内容是否符合要求,并且实际上会刷新指针。

unsigned& busy_children = j->busy_children;
#pragma omp flush(busy_children)

这能保证有效吗?

如果没有,我怎样才能冲洗足尖点?

最佳答案

flush 指令让 OpenMP ARB 头疼了很长时间。如此之多,以至于一直在谈论完全删除它——尽管这会产生其他问题。使用 flush(list) 很难得到正确的结果,即使是 OpenMP 专家也很难得到正确的结果。它的问题在于它的定义方式可以由编译器在您的代码中移动。这意味着您应该远离使用 flush(list)。

至于您关于能够刷新指针对象的问题,只有一种方法可以做到这一点,那就是使用刷新(没有列表)。这将刷新您的整个线程环境,因此,编译器无法移动。看起来“笨手笨脚”,但编译器实际上非常擅长在没有列表的情况下使用刷新时刷新必要的内容。

关于c++ - OpenMP:如何刷新指针目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4821491/

相关文章:

c++ - 奇怪的 C++ 链表错误

c++获取ip地址的代码

c++ - 删除 vector 中的对象

c++ - 如何通过函数内的指针操作 char* 或 char a[]?

c++ - 关于内存缓存的指针性能

reference - 如何避免在 Rust 中为可变和不可变引用编写重复的访问器函数?

c++ - 如何将 vector 从类传递给函数?

c++ - 实现 std::iter_difference_t

c# - 为什么结构允许接口(interface)继承,为什么类不能继承

c++ - 实现 boost 函数指针时出现错误 LNK2005