查找数组中的最小元素及其索引
Finding minimal element in array, and its index
在OpenMP 3.1中,可以有一个带有min
的reduction
子句:
double m;
#pragma omp parallel for reduction(min:m)
for (int i=0;i< n; i++){
if (a[i]*2 < m) {
m = a[i] * 2;
}
return m;
假设我还需要最小元素的索引;有没有办法为此使用 reduction
子句?我相信另一种方法是使用 nowait
和 critical
手动编写缩减。
假设我还需要最小元素的索引;有没有办法为此使用缩减子句?
OpenMP 中可能的减少列表非常...小。特别是,min
和max
是唯一的"更高级别"功能,它们不可自定义。完全。
不得不承认,我不喜欢 OpenMP 的缩减方法,正是因为它丝毫不可扩展,它只设计用于特殊情况。当然,这些都是有趣的特例,但从根本上说,这仍然是一种糟糕的方法。
对于此类操作,您需要通过将线程局部结果累积到线程局部变量并在最后组合它们来自己实现缩减。
执行此操作的最简单方法(实际上非常接近 OpenMP 实现缩减的方式)是拥有一个数组,其中包含每个线程的元素,并使用omp_get_thread_num()
访问元素。但请注意,如果数组中的元素共享缓存行,这将导致性能下降,因为错误共享。要缓解此问题,请填充数组:
struct min_element_t {
double min_val;
size_t min_index;
};
size_t const CACHE_LINE_SIZE = 1024; // for example.
std::vector<min_element_t> mins(threadnum * CACHE_LINE_SIZE);
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
size_t const index = omp_get_thread_num() * CACHE_LINE_SIZE;
// operate on mins[index] …
}
相关文章:
- 在对向量中查找元素的索引
- 当该数组的索引中没有元素时,指针指向什么?
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 如何在C++中递归地找到max元素的索引?
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 使用推力根据索引更改某些元素的值
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- CPtrList - 如何获取元素的索引?
- 获取结构 c++ 中元素的索引
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 矢量指针索引处的读取元素
- C++函数返回两个 char 数组的相同索引元素
- 特征:类似 numpy 的元素索引
- 如何在另一个数组中找到一个未排序数组的不同元素索引?
- C 无法使用嵌套环将数组的元素索引
- Opencv Mat的元素索引产生垃圾
- 在c++中,当元组的元素索引在运行时已知时,是否有可能获得该元素的类型?
- 按内容访问QVector元素索引
- C++ 矢量元素索引