C++ 超快速线程安全 rand 函数

标签 c++ multithreading optimization random

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/

相关文章:

c++ - 特定 std::bind 返回的数据类型到底是什么?

"thread barrier"同步模式上的 C++ 正确原子内存排序

asp.net - MVC Ajax请求不阻塞主线程

c++ - boost asio http服务器,如何停止?

mysql - 查询优化 - 在 SQL 中有效地整理一对多关系表的结果

c++ - 如何读取 MIDI 脚踏 Controller 的初始状态?

c++ - 我需要下载什么才能在没有 Visual Studio 的情况下使用 MFC?

java - JProgressBar 无法从 ActionEvent 正确显示

asp.net - 如何找出产生了哪些控件(多少个)ViewState

大型网站的php&mysql分页脚本