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

10-01 09:21