У меня довольно большой вектор. Некоторые из элементов вектора параллельны определенному условию. Я хотел бы найти первый элемент, соответствующий условию.find_first of a vector in parallel in C++
Моя проблема очень похожа на этот вопрос (tbb: parallel find first element), но у меня нет tbb. Условие проверки очень утомительно (поэтому я не могу сделать это для всех из них последовательно). Вот почему я хотел бы запустить его параллельно. Я должен упомянуть, что мне хотелось бы найти первый элемент (поэтому для меня важна позиция индекса элемента).
Для примера, если у меня есть 4 потока.
ThreadNr Index condition
1 0 Not Meet
2 1 Not Meet
3 2 Not Meet
4 3 Not Meet
ThreadNr Index condition
1 4 Not Meet
2 5 Meet
3 6 Not Meet
4 7 Meet
Функция должна Retun порядковый номер 5. Нити должны быть распределены и работать на последовательном блоке итерации (размер блока может быть больше, что 1. Например, нить 1 работает на первых 4-х элементов, резьбы 2 на вторых 4 элементах и т. Д.).
Для примера выше, если номер потока 4 (в индексе 7) нашел член до номера нити номер 2 (в индексе 5), он должен подождать, пока вся нить завершит работу. Как я уже говорил, самым низким номером индекса является цель.
Пожалуйста, исправьте меня, если у вас есть лучший алгоритм.
ПРИМЕЧАНИЕ: Я могу использовать внешние библиотеки, такие как прирост 1,62, OpenMP 2.0
Обратите внимание, что наилучшая степень сложности возрастает от 0 до N/K, где N - общее количество элементов, а K - количество потоков. – rubenvb
Это зависит от размера элементов и от того, как долго выполняется условие проверки. Если вы делаете что-то простое, например '==' против 'std :: vector', вы не хотели бы чередоваться таким образом, потому что это может привести к хаосу в кеше. В этом случае вам понадобятся потоки, проверяющие блоки целых чисел за раз. Если ваши векторные объекты составляют 1 мб, и для выполнения проверки требуется 1-2 секунды, это чередование может иметь больше смысла. –
RyanP
Если tbb обращается к вам, используйте его. В Openmp, если я понимаю вопрос, вы бы разделили данные, как вы, кажется, сделали с внутренним циклом поиска, объединив внутренние результаты во внешнем сокращении omp firstprivate lastprivate или критически. – tim18