我有一个简单的 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/