Неверный результат с Intel Fortran Compiler на Mac, но хорошо на Linux - PullRequest
1 голос
/ 11 октября 2010

Я работал с быстрым мультипольным кодом в Фортране. Это черный ящик для меня, и у меня была некоторая странность при компиляции его на моем Mac.

Я использую компилятор версии 11.1, у меня есть MacBook Pro с процессором Intel Core 2 Duo 2,5 ГГц на Snow Leopard.

Код работает нормально, когда я устанавливаю флаг оптимизации на -O0, но не работает, когда я использую -O2 или -O3. Что странно, так это то, что код отлично работает на Linux-машине, по крайней мере с флагом -O2 по умолчанию.

У кого-нибудь есть идеи о том, что может быть причиной проблемы? Это должно быть что-то с векторизацией.

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Как уже говорилось, возможно, что конечный результат является численно чувствительным, и оптимизация, которая ослабляет арифметические правила, приводит к числовой нестабильности. Или оптимизация может выявить ошибку в программе. Если код выполняет свое собственное управление памятью (больше не нужно с Fortran 90/95/2003) с внутренним массивом целых, что-то может пойти не так в разных ОС. Я бы расследовал дальше ...

Я предлагаю включить все параметры предупреждения и проверки. Если есть ошибка, и вам повезло, они могут раскрыть ее или дать подсказку. По крайней мере, это легко попробовать. Попробуйте эти варианты:

-проверить все -traceback -warn all -fstack-protector

Вы также можете попробовать "-assume protect_parens", который сделает ifort совместимым со стандартом Fortran, и посмотреть, устранит ли это проблему.

Или, возможно, программа предполагает, что память предварительно выделена для некоторого значения. Это отличие от Linux и Mac ?? Я думаю, что у ifort есть возможности контролировать это. Если это старый код Fortran 77, он может предполагать, что локальные переменные сохраняются при вызове процедур, даже без использования «save» в объявлениях. Существует опция компилятора, заставляющая все локальные переменные действовать так, как если бы использовалось «save» - посмотрите, имеет ли это значение.

1 голос
/ 11 октября 2010

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

Это признак основной «проблемы» с программой, и я бы посоветовал вам не полагаться на результаты «успешных» прогонов программы, пока вы не поймете ее намного лучше - вам нужно открыть приз черный ящик и посмотрим, что внутри.

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

...