使用OpenMP是否有效for循环

时间:2014-11-14 05:38:34

标签: 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,Myvector[i]);
        }
    }

现在someMethod(urn,Myvector[i])将由上述代码中的多个线程调用,将返回一个字符串。此字符串需要附加到返回字符串。我的问题是我需要锁定for循环中的语句吗?有更好的方法吗?有什么建议 ?

1 个答案:

答案 0 :(得分:0)

这不是完美的(自从我使用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);
}

但是,仍存在堆争用问题。

omp_get_num_threads也不能保证返回实际的线程数。