簡體   English   中英

在openmp並行塊內使用預編譯器語句避免未使用的變量警告

[英]Avoiding unused variable warnings with pre-compiler statements inside openmp parallel blocks

背景

我的問題來自於一些特殊的東西。

  1. 我正在使用預處理程序語句來確定要在生成的可執行文件中包括哪種計算
  2. 我將openmp parallel用於具有default(none)塊(因為我很偏執)。
  3. 該代碼可以編譯並正常運行,但是可以根據預處理器標志發出未使用的變量警告。 從技術上講不是錯誤,但是我想刪除這些警告(不,我不只是意味着禁用編譯器警告,而是實際上刪除了原因,即未使用的變量)。

本質上,我有某種形式

#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_1true才是必需的。 我可以將x的聲明及其用法包裝在#if FLAG1 ... #endif語句中,但是我仍然需要在#pragma omp parallel的變量列表中列出x ,據我所知,我不能在#pragma omp parallel語句內嵌套#if FLAG1 ... #endif (它長幾行-變量很多)。 因此,我要么收到有關編譯指示中列出的不存在變量的錯誤,要么收到有關未使用變量的警告。

可能(但不令人滿意)的解決方案

  1. 在這種情況下,刪除的變量都是omp-private,我default(none)承認,只需將default(none)替換為default(private)解決問題。 就是說,我喜歡default(none)的編碼實踐,並且希望盡可能保留它。

  2. 另一個選擇是簡單地將omp-parallel分解為如下所示的內容,但是compute_stuffcompute_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM