我的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秒。这比按顺序运行程序的时间要多。
如果有人能在这个问题上帮助我,我将不胜感激。
答案 0 :(得分:1)
这可能在很多方面出错:
result
的类型的情况下,可能必须构建障碍以避免在修改时出现竞争条件 - 您可以通过使用之后合并的并行结果向量来避免这种情况。vec1
和vec2
向量的复制开销可能大于性能奖励。 总而言之,这是一个关于可并行化矢量类型的问题 - 请参阅您选择的openMP文档,以了解有关可并行访问的类型的更多信息。
答案 1 :(得分:0)
无论如何,我只是从OMP规范中查找了......
•在循环区域内执行的throw必须导致执行在循环区域的同一次迭代中恢复,并且抛出异常的同一线程必须捕获它。
我知道我不喜欢异常的样子。
OpenMP API V4.0第59页。