c – 如何在OpenMP threadprivate指令中直接初始化对象?
发布时间:2020-12-16 07:15:44 所属栏目:百科 来源:网络整理
导读:在 this问题中,其中一个答案引用了OpenMP标准的以下部分: A threadprivate variable with class type must have: an accessible,unambiguous default constructor in case of default initialization without a given initializer; an accessible,unambiguo
在
this问题中,其中一个答案引用了OpenMP标准的以下部分:
在发布的问题上使用(几乎)相同的示例,我想要做的是: struct point2d{ int x; int y; point2d(){ x = 0; y = 0; } //copy constructor point2d(point2d& p){ x = p.x; y = p.y; } }; 并声明point2d类型的两个点变量: point2d global_point; point2d local_point(global_point); #pragma omp threadprivate(local_point) 我看到在发布的问题中使用的示例代码失败,因为OpenMP标准引用部分的第一项(如答案中所指出). 我的问题是,在我的情况下,我如何使用OpenMP标准的第二点来指导初始化私有local_point变量(全部使用global_point)? 此外,它是否有任何意义,或者我完全错过了答案的重点? 解决方法
由于您链接的帖子中讨论的原因,对于某些编译器,您也不能这样做.我想这就是重点.这是一个缺少的功能,编译器甚至没有尝试隐藏它:
你试图实现什么?有了这个简单的结构,你就可以 const int gx = 3; const int gy = -2; point2d local_point = {gx,gx+gy}; #pragma omp threadprivate ( local_point ) 但你必须坚持const基本类型.如果你想在一个函数内初始化你的threadprivate变量(必须是静态的)你可以使用copyin(它会使用第三项,副本赋值,自然) void foo() { static point2d local_point; #pragma omp threadprivate( local_point ) local_point = global_point; #pragma omp parallel copyin( local_point ) { // do something 甚至更好 { point2d local_point( global_point ); #pragma omp parallel firstprivate( local_point ) { // do something 摆脱限制. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |