我正在学习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循环中的语句吗?有更好的方法吗?有什么建议 ?
答案 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
也不能保证返回实际的线程数。