Ошибка при использовании подпрограммы abaqus для чтения файла с несколькими процессорами (процессорами)

У меня возникла ошибка, когда я использую подпрограмму abaqus для чтения файла с несколькими процессорами (процессорами), не могли бы вы помочь мне справиться с этой ошибкой. Большое спасибо

Я хочу прочитать переменные из файла, когда используется один процессор, все в порядке, но когда используется более одного процессора, будет ошибка, кажется, что каждый процессор повторяет одну и ту же команду.

например, ниже приведено содержимое файла для чтения, имя файла — data.dat

*matID ,2,1

131000.000, 8880.000, 8180.000

   0.324,       0.324,       0.300

3990.000,    5320.000,    5320.000

1871.000,      59.700,      59.700

1291.000,     215.000,     215.000

  90.000,     102.000,     102.000

моя подпрограмма выглядит следующим образом: символ*12 проверка1 целое число проверка2,ошибка ОТКРЫТЬ(10,файл='data.dat',статус='старый',iostat=ошибка)
если (ошибка.EQ.0), то читать (10,*,iostat=error) check1,Nm end if
close(10)
print *,'Nm=',nm,error print *,'**'

когда я использую 2 процессора, результаты печати будут:

Nm= 2 0

Nm= 8880 0

**

**


person taishanbuzuo    schedule 23.02.2015    source источник


Ответы (1)


В зависимости от причины чтения данных из файла существует несколько способов избежать этой проблемы:

Если вам нужно получить доступ к данным только один раз: Считайте данные в подпрограмме, которая всегда вызывается последовательно. UEXTERNALDB — хороший пример, и его можно использовать, чтобы открытие файла происходило только в начале анализа или в начале приращения по мере необходимости. Затем вы можете аккуратно хранить информацию в общих блоках. Чтение из общего блока параллельно должно работать нормально, но не пишите в них из параллельных подпрограмм.

Другой способ получить меньший объем данных — вместо этого определить переменные решения во входном файле.

Если вам действительно нужно открыть этот файл локально в каждом параллельном потоке (не понимаю, почему, но готов исправить), вы можете использовать GETNUMCPUS и GETRANK для открытия разных копий файлов в каждом потоке. GETRANK возвращает целое число, дающее вам ранг/идентификатор процесса. Хотя я бы не советовал этот метод. Если ваша проблема достаточно велика, чтобы оправдать использование параллелизма, вам следует избегать ее замедления чтением файлов.

Для получения дополнительной информации см. разделы 1.1.31 и 2.1.4 документации Abaqus 6.14.

person will    schedule 13.05.2015