c++ - 为什么所有内核上的 sin(Vector) 可以和一个内核上的 sin(V) 一样快?

标签 c++ multithreading gcc openmp trigonometry

我有一个简单的 C++ 代码,它在一个值 vector 上运行一个默认的 sin 函数。

static void BM_sin() {
        int data_size = 100000000;
        double lower_bound = 0;
        double upper_bound = 1;
        random_device device;
        mt19937 engine(device());
        uniform_real_distribution<double> distribution(lower_bound, upper_bound);
        auto generator = bind(distribution, engine);
        vector<double> data(data_size);
        generate(begin(data), end(data), generator);
        #pragma omp parallel for
        for(int i = 0; i < data_size; ++i) {
                data[i] = sin(data[i]);
        }
        cout << accumulate(data.begin(), data.end(), 0) << endl;
}

当我将 export OMP_NUM_THREADS 设置为 1 和具有 8 个内核的 8 时,我得到了相同的时间。注释行 #pragma omp parallel for out 也无济于事。所以我想知道为什么从所有线程应用于 vector 的正弦曲线与从一个线程应用于 vector 一样快?

(我在 gcc-4.8 上用 -Ofast -fopenmp 编译)

最佳答案

简单的回答很简单:

  • 并非所有事情都能很好地扩展。我不知道 fast_sin,但可能主要是内存带宽受限。在那种情况下,将工作负载分配给多个核心将一事无成。
  • 另外,我怀疑你的测量方法。如果您的生成器是 mt19337,它比您的正弦波复杂得多,因此并行化您的正弦波并没有太大作用,因为大部分时间都花在了生成随机数上。

关于c++ - 为什么所有内核上的 sin(Vector) 可以和一个内核上的 sin(V) 一样快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37646639/

相关文章:

c++ - C++ 编译器如何检测非常量函数体?

c++ - Microsoft C 异常:内存位置 0x0017F5E0 处的 std::bad_alloc

multithreading - SetEvent ResetEvent WaitForMultipleObjectsEx-竞赛条件?

c# - 在 if 语句中使用方法调用程序

java - 同步缓存服务实现

c++ - 尝试返回具有嵌套结构的迭代器会出现 "does not name type"错误

c++ - MFC CList 是否支持复制赋值?

Objective-C 语法检查器

c++ - 我的 Boost #includes 导致编译失败(重新制定)

c - 复代数表达式的值保持为零