Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Работа с Intel Fortran через Visual Studio 2003 и не только

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Открыть новую тему     Написать ответ в эту тему

KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Вариант, конечно, но у IVF в интеграции со студией есть достаточно интересные плюшки, чтобы использовать именно его в качестве редактора
 
2. Спасибо, попробую поиграться со шрифтами.
 
3. Это понятно. Но здесь как раз проблема в том, что 16-ричные числа некорректно преобразуются в 10-чные
 
4. Мне кажется, что лучше просто знать, что делает, а что не делает в этом отношении компилятор. Чтобы не делать за него лишнюю работу (или делать, если он такой непродвинутый).

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 20:08 27-02-2006
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 3. Это понятно. Но здесь как раз проблема в том, что 16-ричные числа некорректно преобразуются в 10-чные

Это как?
 

Цитата:
Мне кажется, что лучше просто знать, что делает, а что не делает в этом отношении компилятор.

А вот это вам могут и не сказать ) придется запускать много много тестов, хотя нужно тут сказать, что фортрановский компилятор в этом плане довольно "продвинутый" и оптимизирует оччень неплохо.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 20:12 27-02-2006
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Результат преобразования 16-битных чисел в 10-битные (или 8-битные) - это классический пример вычислений с потерей точности. В общем, все законно, жаловаться не на кого.  
 
Про процесс оптимизации при желании кое-что могут сказать. В частности, указывают на объединение постоянных: если было х*4*8, станет х*32. То есть какие-то константы могут быть не как числа, а как переменные с некоторым значением, которое для данного случая компилятору точно известно; их тоже объединят.
 
Одинаковые куски тоже не вычисляют два раза, но только в границах ОДНОГО ВЫРАЖЕНИЯ:
 
Elimination of common subexpressions within a statement. Again, this applies equally to expressions which form subscript calculations. Consider the following assignment:
 
A(I,J+K) = A(I,J+K) + 3 - здесь I,J+K посчитают один раз, а вставят два раза. Цитата из справки к компилятору Salford FTN95. Замена ранее сосчитанным выражением (где-то в другой строчке) возможна, похоже, только в пределах цикла, их причесывают наиболее тщательно.
 
Метки и переходы GOTO ухудшают условия оптимизации.
 
Оптимизация может привести и к несколько неожиданным результатам в плане точности:
 
Some additional optimisations based on the 80486 and Pentium instruction set. In some cases integer instructions are used instead of floating point instructions. This often results in different behaviour... - короче, если в хвосте у числа с плавающей точкой мусор, не обижайтесь, это следствие оптимизации.
 
И, в конце концов, никто не отменял старые способы ускорить выполнение программы, вроде писать квадрат не как степень, а как произведение двух одинаковых переменных, и прочее.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 23:13 27-02-2006
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
  3. Это понятно. Но здесь как раз проблема в том, что 16-ричные числа некорректно преобразуются в 10-чные

 

Цитата:
Результат преобразования 16-битных чисел в 10-битные (или 8-битные) - это классический пример вычислений с потерей точности.

 
Ни...чего себе разница: 16ричные в 10чные и 16-битные в 10-ти )
А потеря точности вполне естественна, есть куча приемов (в зависимости от случая) позволяющих по максимуму сохранять точность.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 23:29 27-02-2006
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, поторопился, не так понял...

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 09:54 28-02-2006
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dima333a
Наверное так и придется.
Спасибо, попробую.
 
Добавлено:
FuzzyLogic
// Это как?
 
Я написал, как - при показе 10-го эквивалента 16-ричного числа оно округляется, а при сравнении - нет (так как сравниваются именно 16-ричные)
Похоже, что это баг отладчика
 
// А вот это вам могут и не сказать
А я надеялся, что меня как раз пошлют по ссылке читать ман.
А его оказывается и нету
Безобразие.
 
Добавлено:
XPEHOMETP
Скорее они не подумали о том, что неплохо было бы использовать более вместительный шаблон. Тогда бы все отображалось правильно.
 
Про константы я в курсе. Они их настолько хорошо оптимизируют, что даже отлаживаться становится проблематично - в процессе отладки невозможно получить константу по имени (я про это уже писал)
 
//  но только в границах ОДНОГО ВЫРАЖЕНИЯ
А несколько выражений в одной строке (разделенных - это одно выражение?
 
То есть в пределах цикла это работает (как раз там обычно и надо)?
 
Добавлено:
FuzzyLogic
// есть куча приемов (в зависимости от случая) позволяющих по максимуму сохранять точность
А можно поподробнее?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 11:29 28-02-2006
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 // есть куча приемов (в зависимости от случая) позволяющих по максимуму сохранять точность
А можно поподробнее?

Ну, приведу конкретный пример из своей области. Есть мат. модель потока жидкости (скажем воды). Одна из переменных этой модели - плотность воды которая изменяется где-то в пределах от 1000 до 1030, а чаще этот интервал ещё меньше. Так вот зачастую пользуются след. приемом: уравнения модели выписывают не для плотности rho а для new_rho=(rho-rho_avg), где rho_avg потом устанавливаем скажем равной 1015 и работаем уже в программе с переменной new_rho, которая колеблется уже не от 1000 до 1030, а от -15 до 15 (или ещё меньше), таким образом выкраиваем дополнительные пару-тройку знаков после запятой.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 12:28 28-02-2006
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPEHOMETP
Осталось понять, где этот шрифт задавать для QuickWin.
В самих окнах ничего настроить нельзя
В среде тоже.
 
Добавлено:
FuzzyLogic
Да, я знаю про такое, спасибо.
А другие приемы?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:31 02-03-2006
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне тут как-то говорили, что можно с помощью size() получить внутри процедуры размерность переданного массива и использовать его для объявления этого массива в процедуре.
Но у меня почему-то не получается
Вот такой пример не работает:
integer,parameter:: FnX = 3, FnY = 49
real x(FnX), y(FnX,FnY)
...
call map2d(x,y)
...
subroutine map2d(x,y)
  integer::FnX=size(x),FnY=size(y,dim=2)

 
Что не так?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:45 19-04-2006
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
Такое очучение что всё не так. В том смысле что так не получится сделать. То что мы видим внутри подпрограммы это не тоже самое что объявлено внутри программы (впиши в начало своей subroutine 'implicit none' и увидишь). Если массив глобальный, тогда можно и размер увидеть, а иначе ... в процедуру ничего кроме указателя ведь не передается.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 11:18 21-04-2006 | Исправлено: FuzzyLogic, 11:18 21-04-2006
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Там какая-то с этим темная материя. Везде пишут, что указатели в Фортране - это не просто ссылки, там еще гонится какая-то инфа про сам массив, про его размерность и очертания, из-за чего не рекомендуют передавать указатель на фортрановский массив в подпрограммы, написанные на С. Будут, мол, взаимные непонятки. Так что, возможно, в каких-то условиях можно заставить эту инфу работать на 100%. Но я этих условий не знаю.
 
Я всегда просто передавал в подпрограмму размерность массива в качестве целого параметра, объявлял массив этого размера, и все туда нормально помещалось. Ну, правда, это тривиальные вещи.
 
 
ЗЫ: Во, вспомнил! Assumed size array! Эта фишка исключена из стандарта Fortran90, но большинство компиляторов должно поддерживать. Делается так: в подпрограмму передается массив, и он объявляется там примерно так:  
 
real(kind=2) :: myarray(*)
 
В общем, существенна звездочка в качестве "размера" массива. Дальше с ним работают, как обычно. Никогда этим не пользовался. Как находят реальный размер массива, не знаю.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 12:35 21-04-2006 | Исправлено: XPEHOMETP, 13:11 21-04-2006
Dust



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
XPEHOMETP
Встречал охрененный код, в котром как раз указатели в фортрановой программе были сделаны посредством врезок С-функций. Так что ничего страшного, если знаешь как

Всего записей: 460 | Зарегистр. 01-03-2002 | Отправлено: 12:50 21-04-2006
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 ЗЫ: Во, вспомнил! Assumed size array!

Угу, но и так, всё равно похоже приходится передавать размерность массива параметром, в противном случае компилятор говорит что не удается определить размерность (пробовал Intel и SGI). Может так оно должно и быть, а может просто реализация компиляторов такая...

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 16:45 21-04-2006 | Исправлено: FuzzyLogic, 16:46 21-04-2006
dima333a



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
 
 
Не совсем понимаю зачем так мучать FORTRAN
 
Задаем переменную INTEGER size_of_array_A
Помещяем эту переменную в common block / interface (для common может потребоватся SAVE)
Потом вычилсяем значение этой переменной до того как вызвать подпрограмму
Обявляем наш common block/interface внутри подпрограммы
Обьявляем наш массив внутри подпрограммы через size_of_array_A

Всего записей: 798 | Зарегистр. 27-02-2004 | Отправлено: 18:55 21-04-2006 | Исправлено: dima333a, 18:56 21-04-2006
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо, надо его мучать по утрам и вечерам! Вот более разумные разъяснения, как это делать:
 
Assumed-Size Arrays
В общем, в фортране-77 это дело действительно пишется со звездочкой:
 
SUBROUTINE PULLDOWN ( A, B, C )
  INTEGER A(5, *), B(*), C(0:1, 2:*)
   
Массивы передаются в подпрограмму в качестве параметров, и описываются в ней со звездочкой в последнем (если их несколько) измерении. Пример взят из FORTRAN77 Language Reference от Sun Microsystems.
 
C Fortran90 вышла неточность: есть там эта штука, только синтаксис поменяли. В книжке Немнюгина и Стесик написано об этом финте как о массиве с подразумеваемой формой:
 
SUBROUTINE replace(a, b)
REAL, DIMENSION( : ) a, b
REAL, DIMENSION(SIZE(b)) r
 
Вместо звездочки стало двоеточие. Встроенная функция SIZE(b) возвращает длину массива; ее можно использовать в операторах описания.
 
А выкинули эту фишку, похоже, из фортрана-95. В справке к FTN95 причислили Assumed-size arrays (i.e. with ‘*’ in the last dimension) к Obsolescent features. Пока еще поддерживается, и даже обещают сохранить в будущих версиях FTN95, но техподдержки в этой области не будет.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 22:39 21-04-2006 | Исправлено: XPEHOMETP, 22:40 21-04-2006
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем спасибо за отклики
 
dima333a
Располагать переменные текущего вызова в комон-блоке, имхо, не очень правильно.
Но как вариант можно иметь в виду.
 
XPEHOMETP
Спасибо, попробовал так - получилось.
Только вот сразу инициализировать переменную почему-то все равно нельзя
 
 
Например, такой пример не работает:
 subroutine map2d(x,y)
  real x( : ),y( : , : )
  integer::FnX=size(x),FnY=size(y,dim=2)
 
 
Интересно, а что они тогда предлагают в замен?
Использовать вместо этого типы?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 13:36 03-05-2006 | Исправлено: KChernov, 13:44 03-05-2006
dima333a



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
 

Цитата:
Располагать переменные текущего вызова в комон-блоке, имхо, не очень правильно.  
 

 
Что значить 'текушего вызова'?  
И почему не очень правильно?
 
На самом деле я не предлагал никуда вызывать эту переменную, а именно хранить ее в common. Т.е. из программы в подпрограмму на прямую переменная не передается, а просто шарится через common block. Помоему это и есть основная функция common block-а..... Если common block будет 'save' то все ИМХО абсолютно по правилам FORTRAN- стандартная конструкция
 
 

Всего записей: 798 | Зарегистр. 27-02-2004 | Отправлено: 16:22 03-05-2006
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dima333a
 
От использования COMMON-блока уже во всю отговаривают во всех новых книжках по Фортрану. Мол, есть уже варианты лучше - вроде через MODULE и USE для данного модуля. А вообще это не очень удобно: нужно четко следить за порядком, в котором прописаны переменные в COMMON-блоке, поскольку они там хранятся в указанном порядке. Написал в подпрограмме не так, значит получишь на выходе не то.
 
KChernov
 
 subroutine map2d(x,y)  
  real x( : ),y( : , : )  
 
- работать НЕ БУДЕТ по всем правилам Фортрана, т.к. аssumed size можно применять только для последнего измерения. Вот такое должно работать:
 
 subroutine map2d(x,y)  
  real x( : ),y(0:6, : )

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 21:12 03-05-2006
dima333a



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPEHOMETP
 

Цитата:
А вообще это не очень удобно: нужно четко следить за порядком, в котором прописаны переменные в COMMON-блоке, поскольку они там хранятся в указанном порядке. Написал в подпрограмме не так, значит получишь на выходе не то.  

 
А я не прописываю  common в каждой сабрутине отдельно. Я использую хедер файлы. Один раз прописал все в хедер файле, а потом INCLUDE стейтментом включаю сразу все богатсва в подпрограмму.
 
Ну и можно конечно модулем пользоватся...  

Всего записей: 798 | Зарегистр. 27-02-2004 | Отправлено: 22:44 03-05-2006
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPEHOMETP

Цитата:
работать НЕ БУДЕТ по всем правилам Фортрана, т.к. аssumed size можно применять только для последнего измерения

Как раз это:
subroutine map2d(x,y)  
  real x( : ),y( : , : )  
у меня работает - что я делаю не так?
 
Не работает именно попытка инициализации переменных размерностями массивов
Вот такой вариант, например, работает:
subroutine map2d(x,y)
  real x( : ),y( : , : )
  integer FnX, FnY
  FnX=size(x)
  FnY=size(y,dim=2)
 
Добавлено:
dima333a
С комон-блоком есть такой момент, что надо не забывать помещать в него правильные данные.
Если вызываешь подпрограмму с параметрами - забыть сложнее.
Особенно это актуально при передаче кода кому-то еще - такая передача параметров должна быть подробно описана.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:15 04-05-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Работа с Intel Fortran через Visual Studio 2003 и не только


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru