[英]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.