Mat*_*son 12 c++ random optimization multithreading
void NetClass::Modulate(vector <synapse> & synapses )
{
int size = synapses.size();
int split = 200 * 0.5;
for(int w=0; w < size; w++)
if(synapses[w].active)
synapses[w].rmod = ((rand_r(seedp) % 200 - split ) / 1000.0);
}
Run Code Online (Sandbox Code Playgroud)
该功能rand_r(seedp)严重瓶颈我的计划.具体来说,它在串行运行时减慢了3倍,在16核运行时减慢了4.4倍.rand()不是一种选择,因为它更糟糕.有什么我可以做的来简化这个吗?如果它会产生影响,我认为我可以在统计随机性方面遭受损失.预先生成(在执行之前)一个随机数列表,然后加载到线程堆栈是一个选项吗?
Marsaglia 的异或移位生成器可能是您可以使用的最快的“合理质量”生成器。它与 MT19937 或 WELL 的“质量”并不完全相同,但老实说,这些差异是学术诡辩。
对于所有真实的实际用途,除了执行速度有 1-2 个数量级的差异以及内存消耗有 3 个数量级的差异外,没有可观察到的差异。
异或移位生成器自然也是线程安全的(从某种意义上说,它将产生非确定性的伪随机结果,并且不会崩溃),没有任何特别之处,并且可以在另一种意义上轻松地使其成为线程安全的(在通过每个线程有一个实例,它将生成每个线程独立的、确定性的、伪随机数的感觉。
也可以使用原子比较交换在另一种意义上使它成为线程安全的(生成一个确定性的伪随机序列,并在线程到来时分发给它们),但我认为这不是很有用。
异或移位生成器仅有的三个值得注意的问题是:
问题是seedp变量(及其内存位置)在多个线程之间共享.处理器核心必须在每次访问这些不断变化的值时同步其缓存,这会妨碍性能.解决方案是所有线程都使用自己的线程seedp,因此避免缓存同步.