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
,因此避免高速缓存同步。