【问题标题】:Equal time execution for running with 4 and 8 threads使用 4 和 8 个线程运行的等时执行
【发布时间】:2018-04-09 22:37:28
【问题描述】:

我使用 OpenMP 测试了一些代码。这里是:

#include <chrono>
#include <iostream>
#include <omp.h>

#define NUM_THREADS 8
#define ARR_SIZE 10000

class A {
private: 
    int a[ARR_SIZE];
public:
    A() {
        for (int i = 0; i < ARR_SIZE; i++)
            a[i] = i;
    }
// <<-----------MAIN CODE HERE--------------->
    void fn(A &o1, A &o2) {
        int some = 0;
        #pragma omp parallel num_threads(NUM_THREADS)
        {
            #pragma omp for reduction(+:some)
            for (int i = 0; i < ARR_SIZE; i++) {
                for (int j = 0; j < ARR_SIZE; j++)
                    some += o1.a[i] * o2.a[j];
            }
        }
        std::cout << some <<std::endl;
    }
};

int main() {
    A a,b,c;
    auto start = std::chrono::high_resolution_clock::now();
    c.fn(a,b);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = end - start;
    std::cout << elapsed.count();
}

执行时间:

  • 1 个线程:0.233663 秒

  • 2 个线程:0.12449 秒

  • 4 个线程:0.0665889 秒

  • 8 个线程:0.0643735 秒

    如您所见,4 线程和 8 线程执行之间几乎没有区别。这种行为的原因是什么?如果你在你的机器上试试这个代码,那也很好;)。

附:我的处理器:

Model:               Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz 
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  2
Core(s) per socket:  4
Socket(s):           1

【问题讨论】:

  • 你有超过 4 个核心吗?
  • 也可能与创建线程的时间与工作量有关。看看当你增加你的数组大小时会发生什么。尝试 10 倍大。
  • 4核8线程
  • 您已超额订阅。此外,无法保证线程开销小于您获得的加速。
  • 您可能不会从 4 个额外的线程中获得太多改进。这将取决于您的计算。

标签: c++ multithreading openmp


【解决方案1】:

您有 4 个物理核心。 promise of hyperthreading 是每个内核可以“考虑”两个任务,并且当它被一个阻塞时(例如,如果它需要等待内存操作完成)将动态地在这两个任务之间进行。从理论上讲,这意味着减少了等待某些操作完成所浪费的时间。然而,在实践中,实际性能提升往往远不及通过将内核数量增加一倍所获得的 2 倍提升。改进通常在 0 到 0.3 倍之间,有时甚至会导致速度变慢。

4 线程本质上是您正在使用的计算机的有用线程上限。具有 8 个物理内核的计算机可能会获得您期望的加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2015-02-22
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多