Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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/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
C++ 多维数组初始化:线程有什么好处?_C++_Multithreading_Multidimensional Array - Fatal编程技术网

C++ 多维数组初始化:线程有什么好处?

C++ 多维数组初始化:线程有什么好处?,c++,multithreading,multidimensional-array,C++,Multithreading,Multidimensional Array,假设我有以下代码: char[5][5] array; for(int i =0; i < 5; ++i) { for(int j = 0; j < 5; ++i) { array[i][j] = //random char; } } char[5][5]数组; 对于(int i=0;i

假设我有以下代码:

char[5][5] array;

for(int i =0; i < 5; ++i)
{
   for(int j = 0; j < 5; ++i)
   { 
       array[i][j] = //random char;
   }
}
char[5][5]数组;
对于(int i=0;i<5;++i)
{
对于(int j=0;j<5;++i)
{ 
数组[i][j]=//随机字符;
}
}
在单独的线程中初始化此数组中的每一行是否有好处

想象一下,不是5乘5的数组,而是10乘10的数组? n×n


此外,在应用程序启动期间,此操作只执行一次。

在现代硬件上?可能没有,因为你没有做任何重要的计算。您很可能会受到内存带宽的限制


不过很容易测试。挑一些来试试吧

值得怀疑,但对于
nxn
的某一点,也许。。。但我认为这是一个非常高的
n
,并且您可能已经在处理这些数据时使用了多线程。请记住,这些线程将写回同一区域,这也可能导致缓存争用

如果你想确定的话,试试看,然后分析一下

此外,在应用程序启动期间,此操作只执行一次

对于这种情况,分配线程的成本可能比使用线程节省的成本更高。尤其是当你只需要做一次的时候。

你是在开玩笑吧

如果不是:答案肯定是否定的

如果将足够多的同步放在一起,以便通过消息队列分派工作,再加上知道所有线程已经完成了它们的行,并且数组已经准备好,那么将产生大量开销。这将远远超过一个CPU核心用已知值填充25个字节所需的时间。因此,对于几乎任何像这样的简单初始化,您都不希望使用线程

还要记住,线程在单核机器上提供并发性,但不会加速。如果您有一个必须同步完成的操作(如数组初始化),那么您只能通过将#个线程添加到#个可用CPU内核来获得价值。理论上


所以,如果你在一个多核系统上,如果你在每个细胞里放的东西花了很长时间来计算。。。当然,利用某种并行性可能是值得的。因此,我喜欢genpfault的建议:为多核系统编写多线程程序,并将其作为一种教育练习来计时,只是为了了解什么时候会发生利益的交叉……

除非您进行大量计算,,否则不会有任何利益。由于缓存效应,您甚至可能会看到更差的性能


这种类型的初始化是内存绑定的,而不是CPU绑定的。初始化数组所需的时间取决于内存的速度;您的CPU将浪费周期,等待内存操作提交。添加更多的线程仍然会让它们都等待内存,如果它们都在为相同的缓存线而斗争,性能会更差,因为现在独立CPU的缓存必须彼此同步以避免缓存不一致。

我做了类似的事情,但在我的情况下,2d数组表示屏幕上的像素。我在做一些非常昂贵的事情,比如色彩渲染,柏林噪音计算。。。在单个线程中启动时,我获得了大约40 fps的速度,但是当我添加了负责计算像素行的从属线程时,我成功地将结果加倍。因此,是的,在某些情况下,多线程可能有助于加快在阵列中执行的任何操作,前提是所做的操作的成本足以证明使用多线程是合理的


您可以下载一个实时演示,在其中调整线程数以观察fps计数器的变化:(多线程测试是“Noise demo 3”)。

这是真实的代码还是仅仅是一个示例?我无法想象初始化一个5x5数组会导致任何性能问题。+1@mmyers,特别是如果你只是想用相同的值来初始化它-为什么不在编译时进行呢?很可能创建线程所需的开销和处理能力,告诉他们该做什么,管理内存访问,etc将超过你从中获得的好处。当您将所有值“初始化”到X时,在代码中假设“uninitialized=X”是否合理?好的,一般来说,有一个潜在的工件,您必须考虑。作为事后考虑。。。如果你对“快速填充内存”有兴趣,你可能想读一下内存映射文件的相关主题:对于小值来说,这听起来像是一个愚蠢的问题。一个措辞更好的问题是,对于一个nxn数组,是否有一个“n”值,这会使线程更高效。你还回答了一个我不一定要问的问题,但我想知道答案:线程在单核CPU上是否比在非线程计算上提供更高的性能。在单CPU系统上,线程总是较慢的。但出于好奇,您可能会选择一个系统配置并尝试查找N。但请记住,有大量的变量。操作系统没有义务在不同的CPU上调度线程,即使它可以选择这样做。现在甚至有关于前台与后台流程优先级的用户选项!线程从根本上讲是关于并发性和独立任务的,当它出现时,您可以接受性能优势,但像这样的情况并不适合。我的主机是双处理器系统,但虚拟机都模拟单处理器x86。在这些虚拟机内,线程没有提供性能提升。有趣的是,您提到了虚拟机。当运行蛋白质折叠客户端时,我注意到在我的机器上运行客户端时,以及在同一台机器上运行两个VM时,会有一个提升(任何增加或减少的操作都会减少总小时数)。这就是为什么我很好奇,因为这不是我所期望的。应用程序被锁定到单个实例