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);
}
函数 rand_r(seedp)
严重阻碍了我的程序。具体来说,串行运行时它会减慢我 3 倍的速度,而在 16 核上运行时会减慢 4.4 倍。 rand()
不是一个选项,因为它更糟。我能做些什么来简化这个吗?如果它会有所作为,我认为我可以在统计随机性方面蒙受损失。预生成(在执行之前)随机数列表然后加载到线程堆栈是一种选择吗?
最佳答案
问题是 seedp
变量(及其内存位置)在多个线程之间共享。处理器内核在每次访问这个不断变化的值时都必须同步它们的缓存,这会影响性能。解决方案是所有线程都使用自己的 seedp
,因此避免缓存同步。
关于C++ 超快速线程安全 rand 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285067/