从OpenMP 4.0开始,支持用户定义的缩减.所以我在这里完全定义了C++中std :: vector的减少.它适用于GNU/5.4.0和GNU/6.4.0,但它使用intel/2018.1.163返回减少的随机值.
这是一个例子:
#include <iostream>
#include <vector>
#include <algorithm>
#include "omp.h"
#pragma omp declare reduction(vec_double_plus : std::vector<double> : \
std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<double>())) \
initializer(omp_priv = omp_orig)
int main() {
omp_set_num_threads(4);
int size = 100;
std::vector<double> w(size,0);
#pragma omp parallel for reduction(vec_double_plus:w)
for (int i = 0; i < 4; ++i)
for (int j = 0; j < w.size(); ++j)
w[j] += 1;
for(auto i:w)
if(i != 4)
std::cout << i << std::endl;
return 0; …Run Code Online (Sandbox Code Playgroud) 带有工作示例的简化问题:我想多次重用 std::unordered_map (我们称之为 umap),类似于以下虚拟代码(它不做任何有意义的事情)。我怎样才能让这段代码运行得更快?
#include <iostream>
#include <unordered_map>
#include <time.h>
unsigned size = 1000000;
void foo(){
std::unordered_map<int, double> umap;
umap.reserve(size);
for (int i = 0; i < size; i++) {
// in my real program: umap gets filled with meaningful data here
umap.emplace(i, i * 0.1);
}
// ... some code here which does something meaningful with umap
}
int main() {
clock_t t = clock();
for(int i = 0; i < 50; i++){
foo();
}
t = clock() - …Run Code Online (Sandbox Code Playgroud)