c++ - 多线程随机数生成瓶颈

标签 c++ multithreading random

我在通过多线程生成随机数时遇到了性能问题。这是对所有线程使用相同随机引擎的原因。然后我实现了一个 vector ,其中包含每个线程的随机引擎(在 stackoverflow 上的另一篇文章中找到了这个解决方案)。但我希望每秒迭代次数与我正在执行的线程数成线性增长。但事实并非如此。

这是一个最小的例子:

#include <random>
#include <omp.h>

const int threads = 4;

int main()
{
    std::uniform_int_distribution<uint64_t> uint_dist;
    std::vector<std::mt19937_64> random_engines;
    std::random_device rd;

    for (int i = 0;i < threads;i++)
        random_engines.push_back(std::mt19937_64((rd())));

    omp_set_num_threads(threads);

    int counter = 0;
    #pragma omp parallel for
    for (int i = 0;i < threads;++i)
    {
        int thread = omp_get_thread_num();
        while (counter < 100)
        {
            if (uint_dist((random_engines[thread])) < (1ULL << 42))
                counter++;
        }
    }
}

当使用一个事件线程执行这段代码时,我的 CPU 平均需要大约 4 秒的执行时间。将线程数设置为 4 使我的平均执行时间约为 2 秒,因此线程数乘以 4,最终加速为 2。 我错过了什么吗?

最佳答案

首先,如果您有两个内核和超线程,您的代码看起来像是四个处理器,但速度不是四倍,幸运的话只比两倍快一点。

其次,如果您使用所有的 CPU 能力,您的计算机会变热,然后降低时钟速度。

第三,您可能正在使用一个具有巨大状态的随机数。一个的状态可能适合 L1 缓存,但不是其中四个的状态。这会导致巨大的减速。

第四,您有一个变量“计数器”,它在线程之间共享并在每次迭代时读取。那不会很快。

关于c++ - 多线程随机数生成瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37731102/

相关文章:

c++ - 在C++中按一列对2d数组进行排序

c++ - ffmpeg Bmp 到 yuv : Crash at sws_scale

c++ - Qt GUI 小部件源文件的重构/分区

java - 该代码适用于notifyAll,但不适用于notify

python - 更快的 numpy 数组复制;多线程内存?

c++ - 我在哪里使用 _endthreadex - Windows API

c++ - 用codelite编译。 'make' 无法识别

c - 字符串显示为奇怪的符号

java - 仅在 Java 中生成随机 "dark"颜色

c++ - 快速随机正态分布发生器