OpenMP "parallel for"在特定程序中很奇怪
OpenMP "parallel for" is weird in specific program
我大约一个月前开始编程,最近我一直在尝试用c++程序学习使用OpenMP进行多核开发。在我编写的大型程序中,我无法使OpenMP正确地为我工作。我想并行执行下面的循环。
for(int iAngle=0; iAngle<int(nAngles); iAngle++){
for(int k=0; k<int(nRadSamples); k++){
int x=coordX[k][iAngle];
int y=coordY[k][iAngle];
for(int i=yMin; i<int(yMax); i++){
int iy=i+y;
for(int j=xMin; j<int(xMax); j++){
response[iAngle][i][j] += inputSlice[iy][j+x];
}
}
}
}
coordX、coordY、response和inputSlice
vector<vector<int> >
vector<vector<int> >
vector<vector<vector<float> > >
vector<vector<float> >
。添加
后会出现相当大的减速(50秒运行时减慢到75秒运行时)#pragma omp parallel for
作为循环上方的行。
我不认为我的问题来自访问响应和inputSlice共享变量,因为即使是基本的OpenMP代码在这个特定的程序中执行奇怪。例如基本程序
#include <stdio.h>
#include <omp.h>
int main() {
//////////////////////
#pragma omp parallel for
for(int i = 0; i<2; i++){
int thread = omp_get_thread_num() + 1 ;
int numThreads = omp_get_num_threads();
printf("Thread %d of %d printing %dn", thread, numThreads,i);
}
////////////////////
return 0;
}
输出Thread 2 of 8 printing 1
Thread 1 of 8 printing 0
但是当我复制并粘贴///////////////边框内的代码到
时int main(int argc, char* argv[])
我的大程序的函数,它输出
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
就好像每个线程单独执行整个for循环,彼此看不到,这可以理解地减慢了程序的运行时间。'i'没有在我的程序的main函数的作用域中声明。
当编译我的程序时,我正在链接到其他库,包括添加-pthreads, -lguide和-ltiff,除了-fopenmp,当编译gcc4.4时。
任何帮助与这个特定的问题,或我的编码风格一般将非常感激!我的头一直在敲击键盘。
我找到了问题所在。我还链接到英特尔图书馆的图书馆指南。因此,它似乎是已知的与gnu的OpenMP实现不兼容。我只是将这个链接器选项改为链接到libiomp5。所以(下载库后),这是兼容-fopenmp,现在我有一个惊人的快程序!!
感谢您的支持!
如果不分析完整的代码,很难看出哪里出了问题。但有一些提示:
减速可能来自
- 访问共享变量时同步锁
- 根据numThreads多次执行相同的工作,
- 向所有线程复制大量数据。
for循环计数器i应该在循环内声明,因此OpenMP可以根据可用线程的数量分割这个循环。另一种可能是声明它
#pragma parallel for private(i)
另一个问题似乎来自于竞争条件,所以所有线程都打印线程号1
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- OpenMP "parallel for"在特定程序中很奇怪