用于创建唯一命名的OpenMP临界区的宏?

时间:2013-12-17 02:10:01

标签: c++ c macros openmp

有几篇文章解释说,最好为OpenMP critical部分指定名称,以便它们的同步不会发生冲突。 例如,请参阅"critical" an entire functionopenMP, atomic vs critical?

是否可以定义一个宏来创建一个OpenMP关键部分,以便每次实例化宏时它都会形成一个唯一的名称? (可能这可以使用__FILE____LINE__?但是,__FILE__是一个字符串?)

类似的东西:

#if defined(_MSC_VER)
#define PRAGMA(...) __pragma(__VA_ARGS__)
#else
#define PRAGMA(...) _Pragma(#__VA_ARGS__) // C++11
#endif

#define BEGIN_LOCK PRAGMA(omp critical (some_incantation_for_a_unique_name))

BEGIN_LOCK { some_code(); }

而且,为什么OpenMP不将此作为默认行为?这有什么缺点吗?

1 个答案:

答案 0 :(得分:0)

如果您需要的只是在一个文件中它是唯一的,您可以使用以下内容:

#define BEGIN_CRITICAL BEGIN_CRITICAL_1( CRITICAL_, __LINE__)
#define BEGIN_CRITICAL_1(F,L) BEGIN_CRITICAL_2(F,L)
#define BEGIN_CRITICAL_2(F,L)  omp critical(F##L)

第一个定义,将2个参数(常量名称和行号)添加到其唯一的男性中。 第二个定义,扩展它们。 第三个,连接它们。

在项目中使其独一无二更难,因为你需要“解串”__FILE__(不确定这是否可以在预处理器中实现)......

另一个选择是获得构建系统的支持:使用文件mane(或任何其他唯一文件ID)添加到编译行-D。例如,如果您要编译foo.cpp,请添加-DMY_FILE=foo.cpp,并使用CRITICAL替换第一个宏中的MY_FILE