Openmp 和 std::vector 上的縮約
Openmp and reduction on std::vector?
我想使这段代码并行:
std::vector<float> res(n,0);
std::vector<float> vals(m);
std::vector<float> indexes(m);
// fill indexes with values in range [0,n)
// fill vals and indexes
for(size_t i=0; i<m; i++){
res[indexes[i]] += //something using vas[i];
}
在本文中,建议使用:
#pragma omp parallel for reduction(+:myArray[:6])
在这个问题中,评论部分提出了同样的方法。
我有两个问题:
- 我不知道编译时
m
,从这两个示例中似乎需要。是这样吗?或者,如果我可以在这种情况下使用它,那么在以下命令#pragma omp parallel for reduction(+:res[:?])
中,我必须用什么替换?
?m
还是n
? for
的指数相对于indexes
和vals
而不是res
,特别是考虑到reduction
是在后者上完成的,这是否相关?
但是,如果是这样,我该如何解决此问题?
对特定类型的C++向量执行用户声明的约简是相当直接的:
#include <algorithm>
#include <vector>
#pragma omp declare reduction(vec_float_plus : std::vector<float> :
std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<float>()))
initializer(omp_priv = decltype(omp_orig)(omp_orig.size()))
std::vector<float> res(n,0);
#pragma omp parallel for reduction(vec_float_plus : res)
for(size_t i=0; i<m; i++){
res[...] += ...;
}
1a( 在编译时不知道m
不是必需的。
1b( 您不能在 std::vector
s 上使用数组部分缩减,因为它们不是数组(并且std::vector::data
不是标识符(。如果可能的话,你必须使用 n
,因为这是数组部分中的元素数。
2(只要你只是阅读indexes
和vals
,就没有问题。
编辑:原来的initializer
卡鲁斯更简单:initializer(omp_priv = omp_orig)
。但是,如果原始副本没有充满零,则结果将是错误的。因此,我建议使用更复杂的初始值设定项,它总是创建零元素向量。
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g