你能想出如何在像id tech 3这样的传统引擎上实现重大改进吗?通过尝试在音频子系统上进行操作,我注意到它会造成减速而不是加速。我怀疑它需要在循环中计算大块数据,并且很少与核心通信。
答案 0 :(得分:2)
我对ioquake3或id tech 3一无所知,但对OpenMP有一点了解,所以我会立即向你发问题。
最初,OpenMP开发用于在跨处理器的大型阵列上分配循环迭代,并且可以访问共享内存。这是大部分科学和工程计划的要求,因此OpenMP很多用于此类计划也就不足为奇了。最近,使用OpenMP 3.0,它具有良好的导演/工作人员任务分解功能,扩展了其应用范围。我对这些新功能没有太多经验,但看起来很有希望。
所以问题是:您的计算核心与OpenMP支持的计算模型的匹配程度如何?
答案 1 :(得分:0)
OpenMP在对不依赖于循环中的其他元素的数据进行操作时非常有效。例如:
std::vector<int> big_vector(1000, 0);
for (int i = 0; i < big_vector.size(); ++i)
{
big_vector[i] = i;
}
可以很好地优化OpenMP,但
std::vector<int> big_vector(1000, 0);
for (int i = 1; i < big_vector.size(); ++i)
{
big_vector[i] = i * (big_vector[i - 1] + i);
}
不会。
您还可以使用OpenMP设置来查看它们是否可以改善结果。有关更多信息,http://www.amazon.com/Multi-Threaded-Engine-Design-Jonathan-Harbour/dp/1435454170有一整章关于OpenMP(以及boost,posix-threads和Windows Threads)。