C++ 使用OpenMP时,此for循环有效吗

C++ 使用OpenMP时,此for循环有效吗,c++,openmp,C++,Openmp,我正在学习OpenMP。这是我正在使用的for循环 std::string result; #pragma omp parallel { #pragma omp parallel for public(local_arg) reduction(+:result) for(int i=0 ; i<Myvector.size();i++) { result = result + someMethod(urn,Myv

我正在学习OpenMP。这是我正在使用的for循环

std::string result;
#pragma omp parallel
    {
        #pragma omp parallel for public(local_arg) reduction(+:result)
        for(int i=0 ; i<Myvector.size();i++)
        {
            result = result + someMethod(urn,Myvector[i]);
        }
    }
std::字符串结果;
#pragma-omp并行
{
#pragma omp并行用于公共(本地参数)缩减(+:结果)
对于(inti=0;i这并不完美(我已经有一段时间没有使用OpenMP了),但其思想是基本的分而治之

std::vector<std::string> results;

int n = 2*omp_get_num_threads();
results.reserve(n); // For reliability, ask OS about # of cores, double that.

// Reserve a small string for each prospective worker
for(int i = 0; i < n; ++i){
    std::string str{};
    str.reserve(worker_reserve);
    results.push_back(move(str));
}

// Let each worker grab and mutate the string
// corresponding to its worker ID
//
#pragma omp parallel for
for(int i = 0; i < Myvector.size(); ++i)
{
    auto &str = results[omp_get_thread_num()];

    str.append(someMethod(urn, Myvector[i]));
}

// Measure the total size of the result
std::string end_result;
size_t total_len = 0;
for(auto &res : results){
    total_len += res.length();
}

// Reserve and combine
end_result.reserve(total_len + 1);

for(auto &res : results){
    end_result.append(res);
}
std::向量结果;
int n=2*omp_get_num_threads();
results.reserve(n);//为了可靠性,向操作系统询问#个内核,增加一倍。
//为每位潜在员工保留一根小绳子
对于(int i=0;i
但是,仍然存在堆争用的问题


另外,
omp\u get\u num\u threads
也不能保证返回实际的线程数。

是的,你需要用这种方式在
result
的变异周围放置一个关键部分。我会在回答中写一个替代方法。谢谢期待。我还写了一些els使用reduce的东西。不确定这是否有用ch编译器?可能您可以使用编译器的并发/并行库。我使用的是openmp2.0 visual studio 2012,因此如何获得可用于meIt的最大循环线程数是不可预测的。OpenMP使用系统线程池,策略通常是“尽可能多”。我想我可能需要稍微调整一下答案…你能这么做吗。还有,你为什么要做
results.reserve(threadcount)
?threadcount可以小于向量的内容。我相信应该是
results.reserve(Myvector.size())
您的代码正在连接字符串。这样做的目的是为工作组中运行的线程保留尽可能多的结果字符串空间。然后,组中的每个工作线程将连接自己的字符串。第一个循环在做什么?