使用 #pragma OMP 并行使程序变慢
using #pragma omp parallel for make the program slower
我的C++程序运行大约需要300秒。在我的程序中,我需要对向量进行 cwis 划分。VS 分析器告诉这需要大约 15% 的运行时间。这是代码:
template <class T> myVector<T> cWisDivide(myVector<T> &vec1,
myVector<T> &vec2)
{
try
{
if (vec1._rows == vec2._rows)
{
myVector<T> result(vec1._rows);
//#pragma omp parallel for
for (int r = 1; r <= vec1._rows; r++)
{
if (vec2(r) != 0)
{
result(r) = vec1(r) / vec2(r);
}
else
{
throw std::runtime_error("");
}
}
return result;
}
}
catch (const exception &e)
{
....
}
}
此函数被多次调用。如果我使用 #pragma...在循环之前,CPU 使用率保持 100% 大约 350 秒,这超过了按顺序运行程序所需的时间。
如果有人能在这个问题上帮助我,我将不胜感激。
这可能会在很多方面出错:
- 在不知道
result
类型的情况下,可能必须内置障碍以避免在修改时出现竞争条件 - 您可以通过之后合并并行结果向量来避免这种情况。 vec1
和vec2
向量的复制开销可能大于性能奖励。
总而言之,这是一个关于可并行化向量类型的问题 -- 请参阅您选择的 openMP 文档以了解有关并行可访问类型的更多信息。
无论如何,我只是从 OMP 规范中查找了它......
• 在循环区域内执行的抛出必须导致在循环区域的同一迭代中恢复执行,并且引发异常的同一线程必须捕获它。
我知道我不喜欢例外的样子。
OpenMP API V4.0 第 59 页。
相关文章:
- 如何并行运行与OpenGL并行的程序
- 激活上下文生成失败,依赖程序集,并行,事件 ID 33
- 并行 Python-C++ 程序冻结(内存?
- 使用 vector<thread> 和 .join() 未并行运行的多线程C++程序
- 哪种方法可以建议加速大规模(CPU)并行程序
- MFC多线程程序可以以并行方法运行
- Pthreads - 将顺序程序转换为并行程序
- 要打开以供C++中的应用程序最佳使用的并行套接字/TCP连接数
- 在C 程序中并行化C代码模块
- 并行程序中的多图或排序向量
- 并行运行一个应用程序,同时用 C++ 启动另一个应用程序
- 使用OpenMP C++并行计算程序的积分
- MFC:类似于Windows资源管理器的应用程序,可以与主线程并行导出文件
- 将带有迭代器的C++程序转换为 Boost MPI 并行程序
- 如何使用 openMP 将顺序程序转换为并行程序
- #pragma omp 并行用于计划会使我的程序崩溃
- 如何组织并行程序的正确输出
- 在cpp中运行计时器,与正在执行的程序并行
- CUDA并行程序需要帮助
- c++终端应用程序并行输入和输出