繁体   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