سؤال

لقد بدأت في استخدام FORTRAN (95) لبعض الكود العددي (إنشاء وحدات بيثون). اليك مثال بسيط:

subroutine bincount (x,c,n,m)
  implicit none
  integer, intent(in) :: n,m
  integer, dimension(0:n-1), intent(in) :: x
  integer, dimension(0:m-1), intent(out) :: c
  integer :: i

  c = 0
  do i = 0, n-1
    c(x(i)) = c(x(i)) + 1 
  end do
end

لقد وجدت أن هذا ينفذ جيدا في 32 بت، ولكن عند ترجمة x86_64 هو حوالي 5x أبطأ (MacBook Pro Core2Duo، Snow Leopard، Gfortran 4.2.3 من R.Research.att.com). أخيرا أدركت أن هذا قد يكون من المقرر أن يستخدم نوع عدد صحيح 32 بت بدلا من النوع الأصلي، وبالفعل عندما استبدل مع عدد صحيح * 8، فإن أداء 64 بت هو أسوأ 25٪ فقط من 32 بت.

لماذا يستخدم عددا صحيحا 32 بت أبطأ بكثير على آلة 64 بت؟ هل هناك أي مشتل ضمنية مستمرة مع الفهرسة التي قد لا أكون على علم بها؟

هل هذا هو الحال دائما أن 64 بت سيكون أبطأ من 32 بت لهذا النوع من التعليمات البرمجية (لقد فوجئت على هذا) - أم أن هناك فرصة يمكنني الحصول على نسخة مترجمة 64 بت التي تعمل بنفس السرعة أو أسرع؟

(السؤال الرئيسي) هل هناك أي طريقة لإعلان متغير (عدد صحيح) أن تكون النوع "الأصلي" ... أي 32 بت عند ترجمة 32 بت، 64 بت عند ترجمة 64 بت في Fortran الحديثة. بدون هذا يبدو أنه من المستحيل كتابة رمز FORTRAN المحمولة الذي لن يكون أبطأا بكثير اعتمادا على كيفية تجميعه - وأعتقد أن هذا يعني أنني سوف تضطر إلى التوقف عن استخدام Fortran لمشروعي. لقد نظرت إلى نوع واختيار_قل ولكن لم يتمكن من العثور على أي شيء يفعل هذا.

تحرير: كان الأداء الكبير ضرب من غلاف F2PY نسخ الصفيف لإلقاءه من 64 بت كثيرة إلى 32 بت كثيرة، لذلك لا شيء متأصل في FORTRAN.

هل كانت مفيدة؟

المحلول

الجواب على "سؤالك الرئيسي" هو تحديد خيار التحويل البرمجي الصحيح لإعلال عدد صحيح الافتراضي مع 32 أو 64 بت. أنا لا أستخدم Gfortran أبدا (أفضل G95، وحتى أفضل مترجم مدفوع) لذلك أنا غاضب ويبدو أن -fdefault-Integer-8 هو الخيار الذي تحتاجه.

مثلك أنا فوجئت أن إصدار 64 بت أبطأ من الإصدار 32 بت. ليس لدي أي شيء يضيء في هذه النقطة.

نصائح أخرى

لقد حاولت أيضا استخدام 64 بت لتشغيل Watfor 77 لكن الألغام كانت مستحيلة تماما. حصلت على مترجم GF-for-for-for-for My 64 بت وجرب بعض الخيارات على Google Ans استخدم لاحقا خيار لاستخدام GCC-MP 4.3 و gfortran 4.3. النسخة التي كانت لا تزال بطيئة. سأقدم النصيحة التي تستخدم فيها آلة 32 بت، وهي FORTRAN COMPAZIBLE لتشغيل البرامج الخاصة بك أو إزالة الصف 64 بت إلى 32 بت لتشغيل Progs أسرع ودقيقة. دعونا نستمر في البحث حتى يحصل على آلة 64 بت runing ceractribened مع watfor77 و progs subroutines.

في حين أنني لم أفعل دراسات دقيقة، إلا أنني لم أر مثل هذه الاختلافات السريعة الكبيرة.

أقترح تجربة نسخة أحدث من GOFRTRAN. الإصدار 4.2 هو في وقت سابق (بدأ GFORTRAN مع 4.0) ويعتبر قديما. 4.3 و 4.4 تحسنت كثيرا وتحتوي على المزيد من الميزات. 4.4 هو النسخة غير التجريبية الحالية. طريقة سهلة للحصول عليها على جهاز Mac هي عبر macports: تشمل حزم GCC43 و GCC44 GFORTRAN. يتم تثبيت المترجمين مثل GCC-MP-4.3، GFORTRAN-MP-4.3، وما إلى ذلك، حتى لا تتعارض مع الإصدارات الأخرى. أو يمكنك تجربة أحدث إصدار من 4.5 من صفحة Govortran Wiki.

إنتل فورتران في بعض الأحيان أسرع بكثير من gfortran.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top