我的问题来自于一些特殊事物的组合。
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
的声明及其用法,但我仍然需要在x
的变量列表中列出#pragma omp parallel
,并且据我所知,我不能在#if FLAG1 ... #endif
语句中嵌套#pragma omp parallel
(它有几行长 - 有很多变量)。所以,我要么在pragma omp中列出不存在的变量列表的错误,要么就未使用的变量发出警告。
default(none)
替换default(private)
就可以解决问题。也就是说,我喜欢default(none)
的编码实践,并希望尽可能保留它。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
}
}
如果没有,替代方案是实现类似于qazxsw poi宏的东西。你可以申报自己的:
Q_UNUSED