我只是(对我而言)非常奇怪的观察,并想知道这是怎么回事.我测试了以下两个版本的代码:
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
process_data(l, 8);
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
cout << "time used: " << time_span.count() << endl;
Run Code Online (Sandbox Code Playgroud)
VS
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
thread t1 = thread(process_data, l, 8);
t1.join();
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
cout << "time used: " << time_span.count() << endl;
Run Code Online (Sandbox Code Playgroud)
由于我不明白的原因,第二个版本快了20%......
怎么会这样?本chrono::steady_clock应正确测量的时候,我想......但我看不出如何创建另一个线程,并等待它实际上是更快然后与初始线程做.我错过了什么?
一些细节:除了上面发布的片段之前的l的定义之外没有代码,并且之后没有其他计算(它是主函数)并且process_data()只是一个大量的数字处理器,包括一些文件读取操作(没有使用线程)那里).
在我目前的遗传算法中,我正在迭代几个相当大的文件.现在我boost::file_mapping用来访问这些数据.
我有3个不同的测试用例我可以启动该程序:(我的电脑有8GB RAM,Windows 8.1,我在页面文件限制上的不同尝试,请阅读下面)
1000个文件,大小约4MB,总共4 GB.这种情况下,首先执行有点迟缓,但从第二次迭代开始,memoryaccess不再是瓶颈,速度完全受我的CPU限制.
1000个文件,大小约6MB,总共6 GB.这是一个完全不同的场景......第一次迭代按比例缓慢,但即使在迭代之后也不会加速.我实际上已经考虑过尝试将4 GB加载到我的内存并保留2 GB映射...不确定这实际上是否有效,但它可能值得测试......但即使这样可行,但这对案例无济于事C)...
1000个文件,大小约13 MB,因此总共13 GB.这完全没有希望.第一次迭代非常慢(考虑到数据量,这是可以理解的),但即使是进一步的迭代也没有显示出速度提升的迹象.甚至对内存的部分负载在这里也无济于事.
现在我尝试了页面文件限制的各种设置:
由Win管理 - pagefil的大小停在5-5.2 GB左右......永远不会变大.这显然对情况b)和c)没有帮助,并且实际上导致文件循环...(如果至少前4 GB将保留,它实际上是有帮助的,因为它现在是,基本上什么都没有被重用来自页面文件)
manual:min 1 GB,max 32 GB:页面文件不会超过4.5GB
手动:最小16GB,最大32 GB:如果你自己没有尝试过这个...不要这样做.这使得启动几乎不可能,并且任何事情都不会顺利进行......是的,我没有用这个测试我的程序,因为这是不可接受的.
所以,我正在寻找的是告诉我的Windows的一些方法,当使用页面文件设置1)或2)时,我真的非常想在我的程序中使用非常大的页面文件.但我不希望我的计算机完全在页面文件上运行(因为它基本上发生在3))有什么办法可以强迫这个吗?
或者有没有其他方法如何以某种方式正确加载数据,以便至少从第二次迭代开始快速完成访问?数据只包含大量的64位整数,这些整数由我的算法进行检测(每200-300个int之间有一堆格式化符号),所以我只需要读访问权限.
如果需要信息,我正在使用VS Pro 2013.代码的可移植性不是问题,它只需要在我的笔记本上运行.当然它是64位应用程序,我的处理器支持;)
我正在寻找某种适用于原子双精度的加法操作。可悲的是:
myatomdouble += toadddouble;
Run Code Online (Sandbox Code Playgroud)
没有定义,
myatomdouble = myatomdouble + toadddouble;
Run Code Online (Sandbox Code Playgroud)
被多线程搞砸了,并且 fetch_add 仅适用于整型,但不适用于双精度型。但像 fetch_add 这样的东西正是我所需要的。:(
每次尝试修改变量时都进行互斥会使程序变得超慢,代码不可读,并且破坏了原子的思想。
那么这个问题有没有办法解决呢?