使用OpenMPv.2.0并行化过滤器迭代器
parallelize filter iterator using openMP v. 2.0
我有一个很大的向量。我想并行增加阳性成员。
class is_positive_number {
public:
bool operator()(int x) { return 0 < x; }
};
int main()
{
int numbers_[] = { 0, -1, 4, -3, 5, 8, -2, 3, 4, -1 };
const int N = sizeof(numbers_) / sizeof(int);
std::vector<int> test_vec(numbers_, numbers_ + N);
std::cout << "max: " << omp_get_max_threads() << std::endl;
int number_of_threads = 4;
int SubVecLen = N / number_of_threads,
LeftOvers = N % number_of_threads;
int k = 0, i = 0, n = 0;
std::vector<int> start_vec, end_vec;
while (n < number_of_threads)
{
k += i;
i = (SubVecLen + (LeftOvers-- > 0 ? 1 : 0));
start_vec.push_back(k);
end_vec.push_back((k + i - 1));
++n;
}
for (size_t n = 0; n < number_of_threads; n++)
{
std::cout << start_vec[n] << "t" << end_vec[n] << "n";
}
is_positive_number predicate;
typedef boost::filter_iterator<is_positive_number, std::vector<int>::iterator>
FilterIter;
#pragma omp parallel
{
#pragma omp for
for (int s = 0; s < 4; s++)
{
FilterIter filter_iter_first(predicate, test_vec.begin(), (test_vec.begin() + start_vec[omp_get_thread_num()]) );
FilterIter filter_iter_last(predicate, test_vec.begin(), (test_vec.begin() + end_vec[omp_get_thread_num()] + 1) );
for (auto iter = filter_iter_first;
iter != filter_iter_last; iter++)
{
std::cout << "num: " << *iter << std::endl;
(*iter) = (*iter) + 1;
}
}
}
for (size_t n = 0; n < test_vec.size(); n++)
{
std::cout << test_vec[n] << "n";
}
return 0;
}
结果是错误的!
但是,我要解决的真正问题比这更复杂。我试图简化我的问题,以便更容易理解。我还必须提到,我仅限于使用OpenMP v.2.0。这就是为什么我试图将矢量分开并将矢量的每个部分划分为特定线程的原因。
任何想法都将不胜感激。
创建过滤器迭代器时使用错误的启动和停止索引。我附上了一个工作示例。我用S选择并行内部的线程进行语句。不确定您的版本是否也可以工作,所以我将其更改为以前的内容。
#pragma omp parallel
{
#pragma omp for
for (int s = 0; s < 4; s++)
{
/* The following lines are important */
FilterIter filter_iter_first(predicate, test_vec.begin() + start_vec[s], (test_vec.begin() + end_vec[s] + 1));
FilterIter filter_iter_last(predicate, test_vec.begin() + end_vec[s] + 1, (test_vec.begin() + end_vec[s] + 1));
for (auto iter = filter_iter_first; iter != filter_iter_last; iter++)
{
std::cout << "num: " << *iter << std::endl;
(*iter) = (*iter) + 1;
}
}
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 使用OpenMPv.2.0并行化过滤器迭代器
- 充当过滤器的范围——不同的迭代器集合
- 为什么GCC -O3在std::deque上使用过滤器迭代器会导致std::距离无限?
- 多态过滤器迭代器范围