说我有以下代码:
char[5][5] array;
for(int i =0; i < 5; ++i)
{
for(int j = 0; j < 5; ++i)
{
array[i][j] = //random char;
}
}
在单独的线程中初始化此数组中的每一行会有好处吗?
想象一下,而不是一个5乘5阵列,我们有10乘10? n x n?
此外,在应用程序启动期间执行一次。
答案 0 :(得分:3)
你在开玩笑吧?
如果不是:答案当然不是!!!
你需要花费大量的开销来组合足够的同步来通过消息队列调度工作,并且知道所有线程已经完成了他们的行并且数组已准备就绪。这将远远超过一个CPU内核用已知值填充25个字节所需的时间。所以对于几乎所有这样的简单初始化你都不想使用线程。
另请注意,线程在单个核心计算机上提供并发但不提供 speedup 。如果你有一个必须同步完成的操作 - 比如一个数组初始化 - 那么你只能通过添加一个最多可用的CPU核心数来获得价值。 理论上。
所以如果你是在多核系统上而如果你在每个单元格中放了什么花了很长时间来计算...那么肯定,它可能值得利用某种并行性。所以我喜欢genpfault的建议:为多核系统编写多线程,并将其作为一种教育练习,以便了解当利益交叉发生的时候......
答案 1 :(得分:2)
除非您进行大量计算,否,否则不会有任何好处。由于缓存效应,您甚至可能会看到更糟糕的性能。
这种类型的初始化是内存限制的,而不是CPU绑定的。初始化数组所需的时间取决于内存的速度;你的CPU只会浪费周期等待内存操作提交。添加更多线程仍然会让它们都等待内存,如果它们都在同一个缓存行上,那么性能会更差,因为现在单独CPU的缓存必须彼此同步以避免缓存不一致。 / p>
答案 2 :(得分:1)
在现代硬件上?可能没有,因为你没有做任何重要的计算。您很可能会受到内存带宽的限制。
虽然很容易测试。鞭打一些OpenMP并给它一个旋转!
答案 3 :(得分:1)
令人怀疑,但是对于某些点n x n
,也许......但我认为它真的很高n
并且您可能已经在处理这些数据时已经多线程了。请记住,这些线程将写回同一区域,这也可能导致缓存争用。
如果您想确切知道,请尝试并进行个人资料。
答案 4 :(得分:1)
此外,在应用程序启动期间执行一次。
对于这种情况,分配线程的成本可能大于使用它们所节省的成本。特别是如果你只需要做一次。
答案 5 :(得分:1)
我做了类似的事情,但就我而言,2d数组代表了屏幕上的像素。我做了相当昂贵的东西,颜色lerping,Perlin噪声计算...当在一个线程中启动它时,我得到大约40 fps,但当我添加负责计算像素行的从属线程时,我设法将结果加倍。所以是的,可能存在这样的情况:多线程有助于加速你在数组中所做的任何事情,假设你所做的事情足够昂贵,足以证明使用多个线程。
您可以下载实时演示,调整线程数以观察fps计数器更改:http://umbrarumregnum.110mb.com/download/mnd(多线程测试是“Noise Demo 3”)。