【发布时间】:2019-04-05 15:23:15
【问题描述】:
背景
我的问题是由一些特定的事情组合而成的。
- 我正在使用预处理器语句来确定生成的可执行文件中要包含哪些类型的计算
- 我正在使用 openmp 并行处理带有
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,而且,据我所知,我可以' t 在#pragma omp parallel 语句中嵌套#if FLAG1 ... #endif(它有好几行——有很多变量)。因此,我要么收到有关 pragma omp 中不存在的变量的错误,要么收到有关未使用变量的警告。
可能(但不令人满意)的解决方案
在这种情况下,删除的变量都是 omp-private,我预先承认只需将
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++ openmp preprocessor-directive unused-variables