[英]Avoiding unused variable warnings with pre-compiler statements inside openmp parallel blocks
我的问题来自于一些特殊的东西。
default(none)
块(因为我很偏执)。 本质上,我有某种形式
#pragma omp parallel \
default(none) \
shared(...) \
private(...)
{
#pragma omp for
for (i = 0; i < num_i; ++i) {
compute_stuff;
#if FLAG_1
compute_more_stuff;
#endif
}
}
为了清楚起见,假设变量x
仅在FLAG_1
为true
才是必需的。 我可以将x
的声明及其用法包装在#if FLAG1 ... #endif
语句中,但是我仍然需要在#pragma omp parallel
的变量列表中列出x
,据我所知,我不能在#pragma omp parallel
语句内嵌套#if FLAG1 ... #endif
(它长几行-变量很多)。 因此,我要么收到有关编译指示中列出的不存在变量的错误,要么收到有关未使用变量的警告。
在这种情况下,删除的变量都是omp-private,我default(none)
承认,只需将default(none)
替换为default(private)
解决问题。 就是说,我喜欢default(none)
的编码实践,并且希望尽可能保留它。
另一个选择是简单地将omp-parallel分解为如下所示的内容,但是compute_stuff
和compute_more_stuff
具有一些共享的计算/内存访问,我希望避免重复。
#pragma omp parallel \
default(none) \
shared(...) \
private(...)
{
#pragma omp for
for (i = 0; i < num_i; ++i) {
compute_stuff;
}
}
#if FLAG_1
#pragma omp parallel \
default(none) \
shared(...) \
private(...)
{
#pragma omp for
for (i = 0; i < num_i; ++i) {
compute_more_stuff;
}
}
#endif
在保持可读性和高效代码的同时,如何保持良好编码习惯的任何想法将不胜感激!
如果您使用的是C ++ 17, [[maybe_unused]]
属性是什么?
#pragma omp parallel \
default(none) \
shared(...) \
private(...)
[[maybe_unused]] variable_potencially_not_used;
{
#pragma omp for
for (i = 0; i < num_i; ++i) {
compute_stuff;
#if FLAG_1
variable_potencially_not_used = 1;
#endif
}
}
如果不是,则替代方法是实现与Q_UNUSED
宏类似的Q_UNUSED
。 您可以声明自己的:
#define MAYBE_UNUSED(X) (void)X
#pragma omp parallel \
default(none) \
shared(...) \
private(...)
MAYBE_UNUSED(variable_potencially_not_used);
{
#pragma omp for
for (i = 0; i < num_i; ++i) {
compute_stuff;
#if FLAG_1
variable_potencially_not_used = 1;
#endif
}
}```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.