【问题标题】:Avoiding unused variable warnings with pre-compiler statements inside openmp parallel blocks使用 openmp 并行块中的预编译器语句避免未使用的变量警告
【发布时间】:2019-04-05 15:23:15
【问题描述】:

背景

我的问题是由一些特定的事情组合而成的。

  1. 我正在使用预处理器语句来确定生成的可执行文件中要包含哪些类型的计算
  2. 我正在使用 openmp 并行处理带有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,而且,据我所知,我可以' t 在#pragma omp parallel 语句中嵌套#if FLAG1 ... #endif(它有好几行——有很多变量)。因此,我要么收到有关 pragma omp 中不存在的变量的错误,要么收到有关未使用变量的警告。

可能(但不令人满意)的解决方案

  1. 在这种情况下,删除的变量都是 omp-private,我预先承认只需将 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++ openmp preprocessor-directive unused-variables


    【解决方案1】:

    如果你使用的是 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 宏类似的东西。你可以自己声明:

    #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
        }
      }```
    

    【讨论】:

    • 我不知道 [[maybe_unused]]。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多