使用openmp并行块中的预编译器语句避免使用未使用的变量警告

问题描述 投票:0回答:1

背景

我的问题来自于一些特殊事物的组合。

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

主要问题

假设为了清楚起见,只有当xFLAG_1时才需要变量true。我可以在x语句中包装#if FLAG1 ... #endif的声明及其用法,但我仍然需要在x的变量列表中列出#pragma omp parallel,并且据我所知,我不能在#if FLAG1 ... #endif语句中嵌套#pragma omp parallel (它有几行长 - 有很多变量)。所以,我要么在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个回答
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
    }
  }

如果没有,替代方案是实现类似于qazxsw poi宏的东西。你可以申报自己的:

Q_UNUSED
© www.soinside.com 2019 - 2024. All rights reserved.