使用#pragma omp parallel使程序变慢 我的C++程序运行大约需要300秒。 在我的程序中,我需要划分向量。VS analyzer告诉我们,这大约需要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) { .... } } 模板myVector cWisDivide(myVector和vec1, myVector和vec2) { 尝试 { if(vec1.\u行==vec2.\u行) { myVector结果(vec1.\u行); //#pragma-omp并行 对于(int r=1;r
,这可能在许多方面出错:使用#pragma omp parallel使程序变慢 我的C++程序运行大约需要300秒。 在我的程序中,我需要划分向量。VS analyzer告诉我们,这大约需要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) { .... } } 模板myVector cWisDivide(myVector和vec1, myVector和vec2) { 尝试 { if(vec1.\u行==vec2.\u行) { myVector结果(vec1.\u行); //#pragma-omp并行 对于(int r=1;r,c++,openmp,C++,Openmp,,这可能在许多方面出错: 在不知道结果的类型的情况下,有可能在修改时必须内置屏障以避免竞争条件——您可以通过在之后合并并行结果向量来避免这种情况 vec1和vec2向量的复制开销可能大于性能奖励 总之,这是一个关于可并行化向量类型的问题——请参阅您选择的openMP文档,以了解有关可并行访问类型的更多信息。无论如何,我只是从OMP规范中查找了它 •在循环区域内执行的抛出必须导致在循环区域的同一迭代内恢复执行,抛出异常的同一线程必须捕获它 我知道我不喜欢这个例外的样子 OpenMP API V4.
结果的类型的情况下
,有可能在修改时必须内置屏障以避免竞争条件——您可以通过在之后合并并行结果向量来避免这种情况vec1
和vec2
向量的复制开销可能大于性能奖励总之,这是一个关于可并行化向量类型的问题——请参阅您选择的openMP文档,以了解有关可并行访问类型的更多信息。无论如何,我只是从OMP规范中查找了它 •在循环区域内执行的抛出必须导致在循环区域的同一迭代内恢复执行,抛出异常的同一线程必须捕获它 我知道我不喜欢这个例外的样子
OpenMP API V4.0第59页。vec1有多大?的
循环中的r
应该在本身的之前定义。如下所示:int r;#pragma….for(r=1…)
尝试进一步向外计算并行区域。如果您多次调用函数,则每次调用都要为初始化付费it@MichałWalenciak Um,不,对于将循环变量置于循环外部的并行程序,意味着它的“最后”值必须由omp保留。这是一个额外的开销,并且将导致小声点。@javad,你在Windows上,对吗?Windows上的Taskman说4核机器上的一个核25%。这真是个愚蠢的问题……你在使用多核机器,不是吗?