Я использую openmp для параллелизации моего кода. У меня есть исходный массив:Сжатие потока (или упаковка массива) с префиксом сканирования с использованием Openmp
A=[3,5,2,5,7,9,-4,6,7,-3,1,7,6,8,-1,2]
и массив марок:
M=[1,0,1,0,0,0,1,0,0,1,1,0,0,0,1,1]
с помощью массива M я могу сжать мой исходный массив в этом упакованном массиве:
A=[3,2,-4,-3,1,-1,2]
я хотел для решения этой проблемы с использованием многопоточного подхода. Библиотека «Thrust» для C++ решает эту проблему, но я не могу найти аналогичные инструменты для Fortran. Есть ли библиотека, такая как «тяга» для C++, которую я могу использовать для выполнения уплотнения потока? Альтернативно, есть ли алгоритм, который я могу написать, используя fortran и openmp, чтобы решить это?
Думаю, вам будет сложно написать программу OpenMP, чтобы превзойти 'A = pack (A, M == 1)'. Я думаю, что накладные расходы, связанные с тем, что несколько потоков записываются в 'A', убьет любое ускорение от распространения работы' pack'ing. Но я с нетерпением жду того, что я ошибаюсь. Как Thrust решает проблему? –
Я мог бы и, возможно, должен был добавить к моему предыдущему комментарию, что я не знаю никакой библиотеки для реализации параллельной версии встроенного в Fortran 'pack'. Полагаю, вам может быть достаточно легко вызвать подпрограммы C++ из Thrust. –
Если ваш вектор очень длинный, вы можете попробовать и разбить его на несколько кусков в цикле «OMP do» и использовать 'pack' для каждого подмножества. Вам нужно будет сохранить полученные подмножества самостоятельно и объединить их в конце. – damienfrancois