OpenMP 正确声明变量
OpenMP properly declaring variables
我是OpenMP和并行化的新手,所以虽然这个问题可能很简单,但我不确定是什么原因造成的,也不确定如何搜索解决方案。我的代码是:
int FindPrime(int size) {
long long next_p = 2;
#pragma omp parallel
shared(next_p,size)
long long tid = omp_get_thread_num();
long long tnum = omp_get_num_threads();
for(int long long i = tid; i < size; i=i+tnum) {
long long j;
j=next_p+1;
while (!IsPrime(j)) {
j++;
}
next_p = j;
}
return next_p;
}
还有一个 main 函数调用 FindPrime
和 isPrime
检查一个数字是否是素数。
当我尝试使用 g++ 和标志-fopenmp
和-lpthread
编译此代码时,我得到结果
error: 'tid' was not declared in this scope
指向线条
for(int long long i = tid; i < size; i=i+tnum){
对我来说也很奇怪,它只抱怨tid
,而不是tnum
,这也来自 OpenMP 函数。
您面临的问题来自您编写的parallel
指令的范围。由于您没有使用 {
和 }
来创建定义其范围的块,因此此块显然仅限于其后面的单行,即
long long tid = omp_get_thread_num();
因此,您的 tid
变量现在只有一行的作用域(其声明),因此当您想在 for
循环中使用它时不会声明。
要解决此问题,您只需添加{
和}
来标记并行块,如下所示:
int FindPrime(int size) {
long long next_p = 2;
#pragma omp parallel shared(next_p,size)
{ // start of the parallel block
long long tid = omp_get_thread_num();
long long tnum = omp_get_num_threads();
for(long long i = tid; i < size; i=i+tnum) {
long long j;
j=next_p+1;
while (!IsPrime(j)) {
j++;
}
next_p = j;
}
} // end of the parallel block
return next_p;
}
这样,您的代码将并行化。但是,我不确定它应该做什么,但我很确定它没有按照您的期望去做......实际上,线程之间的next_p
更新存在争用条件。我相信你应该重新考虑你的算法。
最后,您并行化for
循环的方式与使用 #pragma omp for schedule( static, 1 )
完全相同。如果您想坚持这种方法,您可能应该考虑使用它。
相关文章:
- 在将变量声明为引用时,堆在释放后使用
- 静态变量声明和定义
- 在变量声明中使用 for 循环
- 向量索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)
- C++ 类型类的变量声明不命名类型?
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- std::enable_if 更改成员 *变量* 声明/类型
- 在C++中,变量声明左侧的大括号是什么意思?
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 命名空间内C++变量声明
- 将静态全局变量声明为内联有什么意义吗?
- 如何将一个变量声明为另一个变量的值
- 如何将迭代器变量声明为私有成员变量
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- ClangTool 如何获取变量声明中模板参数的位置?
- 标准与显式自动推导变量声明
- C 静态变量声明怪异链接器错误
- 如何为数组成员变量声明 getter/setter
- 可视C++变量声明