Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在传统的单线程游戏引擎上,如使用OpenMP的ioquake3,可以实现什么样的优化?_Multithreading_Openmp_Game Engine - Fatal编程技术网

Multithreading 在传统的单线程游戏引擎上,如使用OpenMP的ioquake3,可以实现什么样的优化?

Multithreading 在传统的单线程游戏引擎上,如使用OpenMP的ioquake3,可以实现什么样的优化?,multithreading,openmp,game-engine,Multithreading,Openmp,Game Engine,你能想出一些方法来对传统的发动机如id tech 3进行重大改进吗?通过尝试在音频子系统上执行此操作,我注意到它会导致减速而不是加速。我怀疑它需要大量的数据才能在循环中进行计算,而且很少与内核通信。我对ioquake3或id tech 3一无所知,但对OpenMP了解不少,所以我会马上向您发问 OpenMP最初的开发目的是在访问共享内存的处理器之间的大型阵列上分配循环迭代。这是大部分科学和工程项目的要求,因此OpenMP被大量用于此类项目也就不足为奇了 最近,使用OpenMP 3.0,它具有很好

你能想出一些方法来对传统的发动机如id tech 3进行重大改进吗?通过尝试在音频子系统上执行此操作,我注意到它会导致减速而不是加速。我怀疑它需要大量的数据才能在循环中进行计算,而且很少与内核通信。

我对ioquake3或id tech 3一无所知,但对OpenMP了解不少,所以我会马上向您发问

OpenMP最初的开发目的是在访问共享内存的处理器之间的大型阵列上分配循环迭代。这是大部分科学和工程项目的要求,因此OpenMP被大量用于此类项目也就不足为奇了

最近,使用OpenMP 3.0,它具有很好的控制器/工作者任务分解功能,从而扩展了其应用范围。我对这些新功能没有太多经验,但它们看起来很有前途


因此,您的问题是:您的计算核心在多大程度上符合OpenMP支持的计算模型?

OpenMP在不依赖于循环中其他元素的数据上运行时非常有效。例如:

std::vector<int> big_vector(1000, 0);
for (int i = 0; i < big_vector.size(); ++i)
{
    big_vector[i] = i;
}
std::vector big_vector(1000,0);
对于(int i=0;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);
}
std::vector big_vector(1000,0);
对于(int i=1;i
不会


您还可以使用OpenMP设置来查看它们是否改善了您的结果。有关详细信息,有一整章介绍OpenMP(以及boost、posix线程和Windows线程)。

听起来OpenMP更适合多进程,而快速游戏需要在同一进程中使用多个线程。@Mark Storer--不太可能,OpenMP几乎总是作为线程实现,因为大多数o/s都非常努力地防止单独的进程共享内存。正是计算中存在的并行类型(dis)使OpenMP合格。