c++ - 同时使用多个线程C++

标签 c++ multithreading visual-studio-2015

我在为我的 madelbrot 程序使用多线程时遇到问题。

我厌倦教程的原因之一

    int sliceSize = 800 / threads;
    double start = 0, end = 0;
    for (int i = 0; i < threads; i++)
    {
        start = i * sliceSize;
        end = ((1 + i) * sliceSize);

        thrd.push_back(thread(compute_mandelbrot, left, right, top, bottom, start, end));

    }

    for (int i = 0; i < threads; i++)
    {
        thrd[i].join();
    }
    thrd.clear();

但使用 8 个线程时,代码的计算时间仅为一半。

我也尝试过更复杂的方法,但根本不起作用

void slicer(double left, double right, double top, double bottom)
{
    /*promise<int> prom;
    future<int> fut = prom.get_future();*/


    int test = -1;
    double start = 0, end = 0;
    const size_t nthreads = std::thread::hardware_concurrency(); //detect how many threads cpu has
    {
        int sliceSize = 800 / nthreads;

        std::cout << "CPU has " << nthreads << " threads" << std::endl;
        std::vector<std::thread> threads(nthreads);

        for (int t = 0; t < nthreads; t++)
        {

            threads[t] = std::thread(std::bind(
                [&]()
            {

                mutex2.lock();
                test++;

                start = (test) * sliceSize;
                end = ((test + 1) * sliceSize);

                mutex2.unlock();

                compute_mandelbrot(left, right, top, bottom, start, end);


            }));
        }
        std::for_each(threads.begin(), threads.end(), [](std::thread& x) {x.join(); }); //join threads
    }
}

但看起来,当它同时计算 8 个东西时,即使在使用互斥体之后,它们也往往会重叠,而且速度并没有更快。

这让我头疼了 7 个小时,我想自杀。帮助。

最佳答案

当您尝试通过多线程加速工作负载时,有很多因素在起作用,并且在完美的世界中,在乘以 N 个线程时几乎不可能获得 Nx 加速。需要记住的一些事情:

  1. 如果您使用超线程(因此系统上每个虚拟核心使用 1 个线程,而不仅仅是每个物理核心),那么您将无法获得与 2 个真实核心相同的性能 - 您将获得一定百分比的性能(大概是 1.2 倍左右)。
  2. 操作系统 (Windows) 将在您的工作负载执行时执行一些操作。这些操作系统任务何时何地占用您的应用程序时间是相当随机的,但它会产生影响。始终预计您的 CPU 时间的一部分会被 Windows 窃取。
  3. 任何类型的同步都会严重影响性能。在第二个示例中,互斥量非常大,并且可能会影响性能。
  4. 内存访问、缓存访问等都将发挥作用。多个线程访问各处的内存将会对缓存造成压力,从而产生(潜在的)影响。

我很好奇 - 你在这里看到的是什么样的时间?每个线程要传递多少次迭代?要深入了解并查看时间方面发生的情况,您可以尝试使用 queryPerformanceCounter 记录每个线程的开始/结束时间,以查看每个线程运行的时间、启动时间等。在此处发布 1、2、 4 和 8 线程可能会带来一些启发。

希望这至少有一点帮助......

关于c++ - 同时使用多个线程C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50110884/

相关文章:

android - 从异步任务访问 UI 上下文

asp.net - 符号已加载,但仍无法进入.Net 源代码

c++ - 字段初始值设定项不是常量 g++ 4.8.4

c++ - 使用 CRTP 时如何访问基类构造函数

JavaFX 2.1 和线程? - 或 - 优雅地结束 JavaFX 应用程序?

c++ - 如何在 msvc 中编译和链接生成的文件?

android - 在 cordova 的 visual studio 工具中嵌入 youtube 视频

java - JNI - Java 在 native 线程完成执行之前退出

c++ - 钻石层次结构中的低落

java - 使用 Java 通过 http 批量下载图像的好方法