0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 21
|
|
1 | |
Чтение одного и того же файла несколькими потоками на Fortran. Вызов процедур Fortran из C++, используя OpenMP02.02.2022, 09:57. Показов 1538. Ответов 2
С помощью "OpenMP" на C++ я создаю несколько потоков, каждый их которых вызывает некие одинаковые процедуры на Фортране, которые работают с одними и теми же файлами (не изменяют их! только читают). Так вот, у меня постоянно возникают ошибки чтения файла (то формат данных в файле не тот, то ещё что-нибудь). Но если я то же самое буду делать, но в однопоточном режиме, то всё нормально работает, никаких ошибок нет. Так вот, я и подумал, что, может быть, в Фортране нельзя один и тот же файл одновременно читать несколькими потоками? Ну, или что-то в этом роде. Я не знаю Фортрана, но приходится его подключать к C++, по ходу и разбираюсь. Помогите, пожалуйста...
0
|
02.02.2022, 09:57 | |
Ответы с готовыми решениями:
2
Есть задача на чтение из файла и обработку двумерного массива в Fortran, написал на C++, надо написать на fortran Чтение из файла (Fortran 77) OpenMP, Windows, Fortran Не удается распараллелить цикл через OpenMP в Fortran |
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
||||||||||||||||
08.02.2022, 00:32 | 2 | |||||||||||||||
Сообщение было отмечено Abaris как решение
Решение
Abaris, видимо стоит включить режим телепата. Что-то подсказывает что у вас фиксированы юниты при открытии файлов. Вот минимальный пример:
CMakeLisits.txt :Код
cmake_minimum_required(VERSION 3.16) project(example_omp_fortran_from_c++ LANGUAGES C CXX Fortran) find_package(OpenMP REQUIRED) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fno-underscoring") add_executable(exam "main.cpp" "myfun.f95") target_link_libraries(exam OpenMP::OpenMP_C OpenMP::OpenMP_CXX OpenMP::OpenMP_Fortran) set_property(TARGET exam PROPERTY CXX_STANDARD 17) main.cpp :
myfun,f95
myfun,h :
Код
9.9999997764825821E-003 1.0099999904632568 2.0099999904632568 1.9999999552965164E-002 1.0199999809265137 2.0199999809265137 2.9999999329447746E-002 1.0299999713897705 2.0299999713897705 3.9999999105930328E-002 1.0399999618530273 2.0399999618530273 4.9999997019767761E-002 1.0499999523162842 2.0499999523162842 5.9999998658895493E-002 1.0599999427795410 2.0599999427795410 7.0000000298023224E-002 1.0700000524520874 2.0699999332427979 7.9999998211860657E-002 1.0800000429153442 2.0799999237060547 8.9999996125698090E-002 1.0900000333786011 2.0899999141693115 9.9999994039535522E-002 1.1000000238418579 2.0999999046325684 Код
0 0.030000 1.030000 2.030000 1 0.080000 1.080000 2.080000 2 0.100000 1.100000 2.100000 3 0.010000 1.010000 2.010000 4 0.050000 1.050000 2.050000 5 0.090000 1.090000 2.090000 6 0.040000 1.040000 2.040000 7 0.070000 1.070000 2.070000 8 0.020000 1.020000 2.020000 9 0.060000 1.060000 2.060000 - строки перепутаны, т.к. порядок чтения строк и порядок обработки итераций цикла разный. - я открыл файл только один раз, но доступен он из всех потоков. Видимо аналогичное происходит и у вас, и возможно это ещё усугубляется несколькими открытиями/закрытиями файла. Так что совет только один. В одном потоке прочитайте данные, в других их обработайте.
2
|
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 21
|
|
08.02.2022, 04:12 [ТС] | 3 |
Да, там действительно везде эти "юниты" фиксированы, везде какое-то конкретное число пишется. Я тоже подумал, что из-за этого, и теперь вы меня в этом убедили. Спасибо! Я просто Фортран не знаю, и не стал приводить код, так как подумал, что могу что-нибудь по не знанию не относящееся к вопросу привести... Да и решил, что это общий вопрос без привязки к конкретному коду.
0
|
08.02.2022, 04:12 | |
08.02.2022, 04:12 | |
Помогаю со студенческими работами здесь
3
Как перекомпилировать код из Fortran 77 в Fortran 90/95? Fortran Compaque Visual Fortran, линковщик Чтение из файла, запись в файл и работа с TList несколькими потоками Перевод кода с Fortran 7.7 на Fortran 6.6 Генерация случайных чисел несколькими потоками - OpenMP Fortran: вызов массива из подпрограммы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |