有几篇文章解释说,最好为OpenMP critical
部分指定名称,以便它们的同步不会发生冲突。
例如,请参阅"critical" an entire function或openMP, 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不将此作为默认行为?这有什么缺点吗?
答案 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