ফোর্টরান সংকলকরা আরও কতটা ভাল?


74

এই প্রশ্নটি দুটি আলোচনার একটি বর্ধন যা সম্প্রতি " এইচপিসির জন্য সি ++ বনাম ফোর্টরান " এর উত্তরে উঠে এসেছিল । এবং এটি একটি প্রশ্নের চেয়ে কিছুটা চ্যালেঞ্জ ...

ফোর্টরানের পক্ষে সর্বাধিক শোনা যুক্তিগুলির মধ্যে একটি হল যে সংকলকগুলি আরও ভাল। যেহেতু বেশিরভাগ সি / ফোর্টরান সংকলক একই পিছনের অংশটি ভাগ করে, তাই উভয় ভাষায় শব্দার্থগত সমতুল্য প্রোগ্রামগুলির জন্য উত্পন্ন কোডটি সমান হওয়া উচিত। যে কেউ তর্ক করতে পারে, তবে সি / ফোর্টরান কমপ্লায়ারটি অনুকূলিতকরণের জন্য আরও কম / কম সহজ।

সুতরাং আমি একটি সাধারণ পরীক্ষা করার চেষ্টা করার সিদ্ধান্ত নিয়েছি: আমি daxpy.f এবং daxpy.c এর একটি অনুলিপি পেয়েছি এবং সেগুলি gfortran / gcc দিয়ে সংকলন করেছি।

Daxpy.c এখন daxpy.f এর একটি f2c অনুবাদ (স্বয়ংক্রিয়ভাবে উত্পন্ন কোড, হেক হিসাবে কুশ্রী), সুতরাং আমি সেই কোডটি নিয়েছি এবং এটি কিছুটা সাফ করেছি (ডেক্সপি_সি এর সাথে মিলিত), যা মূলত অন্তঃস্থলীয় লুপটি পুনরায় লেখার জন্য বোঝানো হয়েছিল

for ( i = 0 ; i < n ; i++ )
    dy[i] += da * dx[i];

অবশেষে, আমি সিসিএসির ভেক্টর সিনট্যাক্স ব্যবহার করে এটি পুনরায় লিখেছি (daxpy_cvec লিখুন):

#define vector(elcount, type)  __attribute__((vector_size((elcount)*sizeof(type)))) type
vector(2,double) va = { da , da }, *vx, *vy;

vx = (void *)dx; vy = (void *)dy;
for ( i = 0 ; i < (n/2 & ~1) ; i += 2 ) {
    vy[i] += va * vx[i];
    vy[i+1] += va * vx[i+1];
    }
for ( i = n & ~3 ; i < n ; i++ )
    dy[i] += da * dx[i];

নোট করুন যে আমি দৈর্ঘ্য 2 এর ভেক্টর ব্যবহার করি (এগুলিই এসএসই 2 দ্বারা অনুমোদিত) এবং আমি একবারে দুটি ভেক্টর প্রসেস করি। এটি কারণ অনেক আর্কিটেকচারে, আমাদের ভেক্টর উপাদানগুলির তুলনায় আমাদের আরও গুণক ইউনিট থাকতে পারে।

"-O3 -Wall -msse2 -march = নেটিভ-ফার্স্ট-ম্যাথ-ফোমিট-ফ্রেম-পয়েন্টার -মালিগান-ডাবল -স্ট্রিক্ট-এলিয়াসিং" এর সাহায্যে সমস্ত কোডগুলি গফর্ট্রান / জিসিসি সংস্করণ 4.5 ব্যবহার করে সংকলিত হয়েছিল। আমার ল্যাপটপে (Intel Core i5 CPU, M560, 2.67GHz) আমি নিম্নলিখিত আউটপুটটি পেয়েছি:

pedro@laika:~/work/fvsc$ ./test 1000000 10000
timing 1000000 runs with a vector of length 10000.
daxpy_f took 8156.7 ms.
daxpy_f2c took 10568.1 ms.
daxpy_c took 7912.8 ms.
daxpy_cvec took 5670.8 ms.

সুতরাং মূল ফোরট্রান কোডটি 8.1 সেকেন্ডের চেয়ে কিছুটা বেশি সময় নেয়, এর স্বয়ংক্রিয় অনুবাদটি 10.5 সেকেন্ড সময় নেয়, নিষ্পাপ সি বাস্তবায়ন এটি 7.9 সালে করে এবং স্পষ্টভাবে ভেক্টরাইজড কোডটি এটি 5.6-এ প্রান্তিকভাবে কম করে।

এটি ফোরট্রান সিভিল সি বাস্তবায়নের তুলনায় কিছুটা ধীর এবং ভেক্টরাইজড সি প্রয়োগের তুলনায় 50% ধীর গতির হয়ে যাচ্ছে।

সুতরাং এখানে প্রশ্নটি রয়েছে: আমি একজন স্থানীয় সি প্রোগ্রামার এবং তাই আমি পুরোপুরি আত্মবিশ্বাসী যে এই কোডটিতে আমি একটি ভাল কাজ করেছি, তবে ফোর্টরান কোডটি সর্বশেষে ১৯৯৩ সালে ছুঁয়ে গিয়েছিল এবং তাই এটি সম্ভবত কিছুটা পুরানো হতে পারে। যেহেতু আমি এখানে অন্যদের মতো ফোর্টরানে কোডিংয়ের মতো স্বাচ্ছন্দ্য বোধ করি না, তাই কেউ কি আরও ভাল কাজ করতে পারেন, যেমন দুটি সি সংস্করণের যে কোনওটির তুলনায় আরও প্রতিযোগিতামূলক?

এছাড়াও, কেউ কি এই পরীক্ষাটি আইসিসি / ifort দিয়ে চেষ্টা করতে পারেন? ভেক্টর সিনট্যাক্স সম্ভবত কাজ করবে না, তবে আমি সেখানে উদাসীন সি সংস্করণটি কীভাবে আচরণ করে তা জানতে আগ্রহী। এক্সএলসি / এক্সএলএফ চারপাশে থাকা কারও পক্ষে একই কাজ।

আমি উত্স এবং একটি মেকফিল এখানে আপলোড করেছি । সঠিক সময় পেতে, আপনার সিপিইউতে হার্জেডের সংখ্যার জন্য পরীক্ষামূলক সিপিইউপিপিএসে সিপিইউপিপিএস সেট করুন। আপনি যদি সংস্করণগুলির কোনওর মধ্যে কোনও উন্নতি পেয়ে থাকেন তবে দয়া করে সেগুলি এখানে পোস্ট করুন!

হালনাগাদ:

আমি অনলাইনে ফাইলগুলিতে স্টালির পরীক্ষার কোড যুক্ত করেছি এবং এটি একটি সি সংস্করণ দিয়ে পরিপূরক করেছি। পূর্ববর্তী পরীক্ষার সাথে সামঞ্জস্য রাখতে আমি 10'000 দৈর্ঘ্যের ভেক্টরগুলিতে 1'000'000 লুপগুলি করতে প্রোগ্রামগুলি সংশোধন করেছি (এবং কারণ আমার মেশিন স্টালির মূল হিসাবে 1'000'000'000 দৈর্ঘ্যের ভেক্টর বরাদ্দ করতে পারেনি কোড)। যেহেতু সংখ্যাগুলি এখন কিছুটা ছোট, তাই আমি -par-threshold:50সংকলকটিকে সমান্তরাল হওয়ার সম্ভাবনা তৈরি করতে বিকল্পটি ব্যবহার করেছি used ব্যবহৃত আইসিসি / আইফোর্ট সংস্করণটি 12.1.2 20111128 এবং ফলাফলগুলি নিম্নরূপ

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=1 time ./icctest_c
3.27user 0.00system 0:03.27elapsed 99%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=1 time ./icctest_f
3.29user 0.00system 0:03.29elapsed 99%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=2 time ./icctest_c
4.89user 0.00system 0:02.60elapsed 188%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=2 time ./icctest_f
4.91user 0.00system 0:02.60elapsed 188%CPU

সংক্ষেপে, ফলাফলগুলি সমস্ত ব্যবহারিক উদ্দেশ্যে, সি এবং ফোর্টরান উভয় সংস্করণের জন্য অভিন্ন এবং উভয় কোডই স্বয়ংক্রিয়ভাবে সমান্তরাল হয়। নোট করুন যে আগের পরীক্ষার তুলনায় দ্রুতগতির সময়গুলি সিঙ্গল-স্পষ্টতা ভাসমান পয়েন্ট গাণিতিক ব্যবহারের কারণে হয়!

হালনাগাদ:

যদিও প্রমাণের বোঝা এখানে চলেছে তা আমি সত্যিই পছন্দ করি না, তবে আমি স্টির ম্যাট্রিক্সের গুণকে উদাহরণস্বরূপ কোড করেছি এবং এটি ওয়েবে ফাইলগুলিতে যুক্ত করেছি । এক এবং দুটি সিপিইউয়ের জন্য ট্রিপল লুপের ফলাফল এখানে রয়েছে:

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=1 time ./mm_test_f 2500
 triple do time   3.46421700000000     
3.63user 0.06system 0:03.70elapsed 99%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=1 time ./mm_test_c 2500
triple do time 3.431997791385768
3.58user 0.10system 0:03.69elapsed 99%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=2 time ./mm_test_f 2500
 triple do time   5.09631900000000     
5.26user 0.06system 0:02.81elapsed 189%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=2 time ./mm_test_c 2500
triple do time 2.298916975280899
4.78user 0.08system 0:02.62elapsed 184%CPU

নোট করুন যে cpu_timeফোর্টরান সিপিইউয়ের সময় পরিমাপ করে দেয়াল-ঘড়ির সময় নয়, তাই আমি কলগুলিকে time2 টি সিপিইউয়ের সাথে তুলনা করতে গুটিয়ে রেখেছি । ফলাফলগুলির মধ্যে সত্যিকারের কোনও পার্থক্য নেই, কেবল দুটি সংস্করণে সি সংস্করণটি আরও ভাল করে।

এখন matmulকমান্ডের জন্য, অবশ্যই কেবল ফোর্টরানে কারণ এই অভ্যন্তরীণটি সি তে পাওয়া যায় না:

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=1 time ./mm_test_f 2500
 matmul    time   23.6494780000000     
23.80user 0.08system 0:23.91elapsed 99%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=2 time ./mm_test_f 2500
 matmul    time   26.6176640000000     
26.75user 0.10system 0:13.62elapsed 197%CPU

কি দারুন. এটা একেবারে ভয়ানক। আমি কী ভুল করছি তা কেউ জানতে পারে, বা ব্যাখ্যা করতে পারে যে কেন এই অভ্যন্তরীণতা এখনও কোনও ভাল জিনিস?

আমি dgemmইনটেল এমকেএল একই ফাংশনে লাইব্রেরি কল হওয়ায় আমি বেঞ্চমার্কে কলগুলি যুক্ত করিনি ।

ভবিষ্যতের পরীক্ষাগুলির জন্য, কেউ ফর্ট্রানের তুলনায় সি-তে ধীরতম বলে পরিচিত উদাহরণটি কি প্রস্তাব করতে পারেন ?

হালনাগাদ

matmulছোট ম্যাট্রিকগুলিতে স্পষ্টতাত্ত্বিক ম্যাট্রিক্স পণ্যটির চেয়ে অন্তর্নিহিত "ম্যাগনিটুয়ের ক্রম" হ'ল স্ট্যালির দাবী যাচাই করতে , আমি তার নিজস্ব কোডটি উভয় পদ্ধতি ব্যবহার করে 100x100 আকারের ম্যাট্রিকগুলিকে প্রতিটি 10'000 বার ব্যবহার করে পরিবর্তন করেছি। এক এবং দুটি সিপিইউতে ফলাফলগুলি নিম্নরূপ:

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=1 time ./mm_test_f 10000 100
 matmul    time   3.61222500000000     
 triple do time   3.54022200000000     
7.15user 0.00system 0:07.16elapsed 99%CPU

pedro@laika:~/work/fvsc$ OMP_NUM_THREADS=2 time ./mm_test_f 10000 100
 matmul    time   4.54428400000000     
 triple do time   4.31626900000000     
8.86user 0.00system 0:04.60elapsed 192%CPU

হালনাগাদ

গ্রিসু উল্লেখ করে সঠিক যে, অপ্টিমাইজেশন ছাড়াই, জিসিসি জটিল সংখ্যায় ক্রিয়াকলাপগুলি লাইব্রেরি ফাংশন কলগুলিতে রূপান্তরিত করে যখন গফর্ট্রান তাদের কয়েকটি নির্দেশিকায় ইনলাইন করে।

সি সংকলক বিকল্পটি -fcx-limited-rangeসেট করা থাকলে একই, কমপ্যাক্ট কোড উত্পন্ন করবে , অর্থাত্ সংকলককে মধ্যবর্তী মানগুলিতে সম্ভাব্য ওভার / নিম্ন-প্রবাহকে উপেক্ষা করার জন্য নির্দেশ দেওয়া হয়েছে। এই বিকল্পটি কোনওভাবে গফর্ট্রানে ডিফল্টরূপে সেট করা আছে এবং ভুল ফলাফল হতে পারে। অত্যাচার -fno-cx-limited-rangegfortran কিছু পরিবর্তন হয়নি।

সুতরাং এটি আসলে সংখ্যার গণনার জন্য গফর্ট্রান ব্যবহারের বিরুদ্ধে একটি যুক্তি : জটিল মানগুলির উপর অপারেশনগুলি প্রবাহিত / নিচে প্রবাহিত হতে পারে এমনকি সঠিক ফলাফলগুলি ভাসমান-বিন্দু সীমার মধ্যে থাকলেও। এটি আসলে ফোর্টরান স্ট্যান্ডার্ড। জিসিসি বা সাধারণভাবে সি 99 এ ডিফল্টরূপে অন্যথায় নির্দিষ্ট না করা পর্যন্ত কাজগুলি কঠোরভাবে করা (আইইইই -754 অনুগামী পড়ুন)।

অনুস্মারক: দয়া করে মনে রাখবেন যে মূল প্রশ্নটি ছিল ফোর্টরান সংকলক সি সিগেলারগুলির চেয়ে ভাল কোড উত্পাদন করে কিনা। এক ভাষার অন্য ভাষার সাধারণ গুণাগুণ সম্পর্কে এটি আলোচনার জায়গা নয়। আমি যে বিষয়ে আগ্রহী তা হ'ল যদি কেউ স্পষ্টভাবে ভেক্টরাইজেশন ব্যবহার করে সি-এর মতো দক্ষতার মতো একটি ড্যাক্সি তৈরির জন্য গফট্রানকে কোক্সিং করার কোনও উপায় খুঁজে পায় তবে এটি কেবলমাত্র সিমড অপ্টিমাইজেশনের জন্যই সংকলকটির উপর নির্ভর করার সমস্যাগুলির উদাহরণ দেয় বা একটি যে ক্ষেত্রে কোনও ফোর্টরান তার সি প্রতিরূপ তৈরি করে।


একটি সময়সীমার সমস্যাটি হ'ল যদি আপনার প্রসেসর ফ্রিকোয়েন্সি স্টেপিং / টার্বো মোড করেন তবে এই ফলাফলগুলি পুরো মানচিত্রেই হতে পারে।
বিল বার্থ

1
আপনার daxpy_c.c বর্তমানে এক্সকে একাধিক এক্স দিয়ে আপডেট করছে এবং y টি মোটেও স্পর্শ করছে না। এটিকে ন্যায্য করার জন্য আপনি এটি ঠিক করতে চাইতে পারেন ...
জ্যাক পলসন

1
@ জ্যাকপুলসন: ভাল ক্যাচড, ফলাফলগুলি স্থির করে আপডেট করেছেন।
পেড্রো

2
এছাড়াও, আমি মোটামুটি নিশ্চিত যে ফোর্টরান সংস্করণটিতে ম্যানুয়ালটি অনিয়ন্ত্রিত করে সংকলককে বিভ্রান্ত করার কারণে পার্থক্যটি সম্পূর্ণরূপে। আপনি যখন নিজের সি সংস্করণে রেখেছেন সেই একই সরল লুপের সাথে আমি যখন এটি প্রতিস্থাপন করব তখন দুজনের পারফরম্যান্স প্রায় অভিন্ন। পরিবর্তন ছাড়াই, ফোর্টরান সংস্করণটি ইন্টেল সংকলকগুলির সাথে ধীর ছিল।
জ্যাক পলসন

1
@permeakra: আসলে, C99 স্ট্যান্ডার্ডটি মূলশব্দটি নির্দিষ্ট করে restrictযা সংকলককে ঠিক তা বলে: এটি ধরে নিতে যে কোনও অ্যারে অন্য কোনও ডাটা স্ট্রাকচারের সাথে ওভারল্যাপ হয় না।
পেড্রো

উত্তর:


37

আপনার সময়ের পার্থক্যটি ইউনিট-স্ট্রাইড ফোর্ত্রান ড্যাক্সির ম্যানুয়ালি তালিকাভুক্তির কারণে বলে মনে হচ্ছে । কমান্ডটি ব্যবহার করে নিম্নলিখিত সময়গুলি একটি 2.67 গিগাহার্টজ জিয়ন X5650 এ রয়েছে

./test 1000000 10000

ইন্টেল 11.1 সংকলক

ম্যানুয়ালি আনرولিং সহ ফোরট্রান: ৮.7 সেকেন্ড
ফোর্টরান ডাব্লু / ও ম্যানুয়াল আনرولিং: ৫.৮ সেকেন্ড
সি ডাব্লু / ও ম্যানুয়াল এনআরোলিং: 5.8 সেকেন্ড

GNU 4.1.2 সংকলক

ম্যানুয়ালি আনرولিং সহ ফোরট্রান: 8.3 সেকেন্ড
ফোর্টরান ডাব্লু / ও ম্যানুয়াল আনرولিং: 13.5 সেকেন্ড
সি ডাব্লু / ও ম্যানুয়াল এনআরোলিং:
ভেক্টর বৈশিষ্ট্য সহ 13.6 সেকেন্ড সি: 5.8 সেকেন্ড

GNU 4.4.5 সংকলক

ম্যানুয়ালি আনرولিং সহ
ফোরট্রান : ৮.১ সেকেন্ড ফোরট্রান ডাব্লু
/ ও ম্যানুয়াল
আনرولিং: .4.৪ সেকেন্ড সি ডাব্লু / ও ম্যানুয়াল এনআরোলিং: ভেক্টর প্রাপ্তির সাথে 8.5 সেকেন্ড সি: 5.8 সেকেন্ড

উপসংহার

  • ম্যানুয়াল আনرولিং এই আর্কিটেকচারে জিএনইউ ৪.১.২ ফোর্টরান সংকলকগুলিকে সহায়তা করেছে, তবে নতুন সংস্করণ (৪.৪.৫) এবং ইনটেল ফোর্টরান সংকলককে আঘাত করে।
  • জিএনইউ ৪.৪.৫ সি সংকলক ফোর্টরানের সাথে সংস্করণ ৪.২.১-এর চেয়ে অনেক বেশি প্রতিযোগিতামূলক।
  • ভেক্টর অভ্যন্তরীণগুলি জিসিসির পারফরম্যান্সটিকে ইন্টেল সংকলকগুলির সাথে মেলে।

ডিজেএমভি এবং ডিজিএমএম এর মতো আরও জটিল রুটিনগুলি পরীক্ষা করার সময়?


ফলাফলের জন্য ধন্যবাদ! আপনি সিসিইউর কোন সংস্করণ ব্যবহার করছেন এবং আপনি কি সিপিইউ সম্পর্কিত আরও কিছুটা নির্দিষ্ট হতে পারেন?
পেড্রো

2
আপনার সংকলকটি আপনার সিপিইউর চেয়ে পুরানো ... আপনি কি জিসিসি -৪.৫ দিয়ে চেষ্টা করতে পারেন?
পেড্রো

1
আমি এটি চেষ্টা করেছিলাম। জিসিসি ৪.৪.৫ সহ ভেক্টরাইজড সংস্করণটি ইন্টেল ১১.১ ফলাফলের সাথে হুবহু মিলে।
জ্যাক পলসন

1
আমি সবেমাত্র জিসিসি / গফর্ট্রান সংস্করণ 4.4.5 ইনস্টল করেছি এবং আমি ডাব্লু / ও এনআরোলিংয়ের পার্থক্যগুলি পুনরুত্পাদন করতে পারি না। প্রকৃতপক্ষে, উভয় ক্ষেত্রেই উত্পন্ন এসেমব্লারে, অভ্যন্তরীণ লুপটি ব্যবহৃত রেজিস্টার নাম বাদে অভিন্ন, যা বিনিময়যোগ্য। আপনি কি নিশ্চিত হয়ে পরীক্ষা চালাতে পারবেন?
পেড্রো

4
আমরা কি এই জাতীয় বয়সের বিতর্ককে মীমাংসা করে বলতে পারি "আমরা আরও বেশি পারফরম্যান্ট হওয়ার কারণে ফোর্টারান ব্যবহার করি", যাতে শেষ পর্যন্ত আমরা এটিকে ডাম্পাস্টারে ফেলে দিতে পারি?
স্টেফানো বোরিনি

16

আমি এই পার্টিতে দেরি করে আসছি, সুতরাং উপরের দিক থেকে পিছনে পিছনে অনুসরণ করা আমার পক্ষে শক্ত। প্রশ্নটি বড়, এবং আমি মনে করি আপনি যদি আগ্রহী হন তবে এটি ছোট ছোট টুকরো টুকরো হয়ে যেতে পারে। একটা জিনিস সম্পর্কে আমি আগ্রহী হয়েছি তা হ'ল কেবল আপনার daxpyরূপগুলির পারফরম্যান্স এবং এই খুব সহজ কোডটিতে ফোর্টরান সি এর চেয়ে ধীর whether

আমার ল্যাপটপে (ম্যাকবুক প্রো, ইন্টেল কোর আই 7, 2.66 গিগাহার্টজ) উভয়ই চালানো, আপনার হাত-ভেক্টরাইজড সি সংস্করণ এবং নন-হ্যান্ড ভেক্টরাইজড ফোর্টরান সংস্করণটির আপেক্ষিক কর্মক্ষমতা ব্যবহৃত সংকলকের (আপনার নিজস্ব বিকল্পগুলির) উপর নির্ভর করে:

Compiler     Fortran time     C time
GCC 4.6.1    5408.5 ms        5424.0 ms
GCC 4.5.3    7889.2 ms        5532.3 ms
GCC 4.4.6    7735.2 ms        5468.7 ms

সুতরাং, এটি ঠিক মনে হয় যে জিসিসি আগের তুলনায় 4.6 শাখায় লুপটি ভেক্টরাইজিংয়ে আরও ভাল হয়েছে।


সামগ্রিক বিতর্ক উপর, আমি মনে করি যে কেউ প্রায় সমাবেশের ভাষায়, সি এবং ফোর্টরান উভয়ই দ্রুত এবং অনুকূলিত কোড লিখতে পারে। তবে আমি একটি বিষয় উল্লেখ করব: ঠিক যেমন এসেম্বলার সি-র চেয়ে লেখার জন্য আরও ক্লান্তিকর তবে আপনাকে সিপিইউ দ্বারা নির্বাহ করা হয়েছে তার উপর সূক্ষ্ম নিয়ন্ত্রণ দেয়, সি ফর্ট্রানের চেয়ে কম নিম্ন স্তরের। সুতরাং, এটি আপনাকে বিশদগুলির উপরে আরও নিয়ন্ত্রণ দেয়, যা অনুকূলকরণে সহায়তা করতে পারে, যেখানে ফোর্টরান স্ট্যান্ডার্ড সিনট্যাক্স (বা এর বিক্রেতার এক্সটেনশান) কার্যকারিতার অভাব হতে পারে। একটি কেস ভেক্টর প্রকারের স্পষ্ট ব্যবহার, অন্যটি হস্ত দ্বারা ভেরিয়েবলের প্রান্তিককরণ নির্দিষ্টকরণের সম্ভাবনা, ফোর্টরান কিছুতেই অক্ষম।


Scicomp স্বাগতম! আমি একমত যে সংকলক সংস্করণগুলি এই ক্ষেত্রে ভাষার মতোই গুরুত্বপূর্ণ। আপনি কি আপনার শেষ বাক্যে "এর" পরিবর্তে "বোঝাতে চেয়েছিলেন?
অ্যারন আহমদিয়া

9

ফোর্টরানে আমি যেভাবে এক্সএফওয়াই লিখব তা কিছুটা আলাদা। এটি গণিতের সঠিক অনুবাদ।

m_blas.f90

 module blas

   interface axpy
     module procedure saxpy,daxpy
   end interface

 contains

   subroutine daxpy(x,y,a)
     implicit none
     real(8) :: x(:),y(:),a
     y=a*x+y
   end subroutine daxpy

   subroutine saxpy(x,y,a)
     implicit none
     real(4) :: x(:),y(:),a
     y=a*x+y
   end subroutine saxpy

 end module blas

এখন আসুন একটি প্রোগ্রামে উপরের রুটিন কল।

test.f90

 program main

   use blas
   implicit none

   real(4), allocatable :: x(:),y(:)
   real(4) :: a
   integer :: n

   n=1000000000
   allocate(x(n),y(n))
   x=1.0
   y=2.0
   a=5.0
   call axpy(x,y,a)
   deallocate(x,y)

 end program main

এখন এটি সংকলন এবং চালানো যাক ...

login1$ ifort -fast -parallel m_blas.f90 test.f90
ipo: remark #11000: performing multi-file optimizations
ipo: remark #11005: generating object file /tmp/ipo_iforttdqZSA.o

login1$ export OMP_NUM_THREADS=1
login1$ time ./a.out 
real    0 m 4.697 s
user    0 m 1.972 s
sys     0 m 2.548 s

login1$ export OMP_NUM_THREADS=2
login1$ time ./a.out 
real    0 m 2.657 s
user    0 m 2.060 s
sys     0 m 2.744 s

লক্ষ্য করুন যে আমি কোনও লুপ বা স্পষ্ট কোনও ওপেনএমপি নির্দেশনা ব্যবহার করছি না । এটি কি সিতে সম্ভব হবে (এটি কোনও লুপ এবং অটো-প্যারালালাইজেশন ব্যবহার নয়)? আমি সি ব্যবহার করি না তাই জানি না।


স্বয়ংক্রিয় সমান্তরালতা ভাষা নয়, ইন্টেল সংকলকগুলির (ফোর্টরান এবং সি উভয়) বৈশিষ্ট্য। সুতরাং সি এর সমতুল্যও সমান্তরাল হওয়া উচিত। কৌতূহলের বাইরে, এটি আরও মধ্যম n = 10000 এর জন্য কীভাবে সম্পাদন করে?
পেড্রো

3
যে ছিল সমগ্র বিন্দু। ফোর্টরান (সি এর বিপরীতে) ম্যাটারমল্ট, ট্রান্সপোজ ইত্যাদির মতো পুরো অ্যারে ক্রিয়াকলাপ সমর্থন করে ফোর্টরান সংকলকগুলির জন্য কোড অপ্টিমাইজেশন সহজতর হওয়ার কারণে ফোর্টরানে অটোপার আরও সহজ। জিএফোর্টরান (যা আপনি ব্যবহার করেছেন) এর কাছে ফোর্টরান সংকলকটি অনুকূলকরণের বিকাশকারী সংস্থান নেই কারণ তাদের ফোকাসটি এখন অপ্টিমাইজেশনের পরিবর্তে ফোর্টরান 2003 স্ট্যান্ডার্ড বাস্তবায়িত করছে।
stali

আহ ... ইন্টেল সি / সি ++ সংকলকটি iccস্বয়ংক্রিয়ভাবে সমান্তরালকরণও করে। আমি icctest.cঅন্য উত্সগুলিতে একটি ফাইল যুক্ত করেছি । আপনি কি এটি উপরে উল্লিখিত বিকল্পগুলির সাথে একই সংকলন করতে পারেন, চালাবেন, এবং সময়গুলি রিপোর্ট করতে পারবেন? জিসি সব কিছু অপ্টিমাইজ করা এড়াতে আমাকে আমার কোডে একটি প্রিন্টফেটমেন্ট যুক্ত করতে হয়েছিল। এটি কেবল একটি দ্রুত হ্যাক এবং আমি এটি বাগ-মুক্ত আশা করি!
পেড্রো

আমি সর্বশেষতম আইসিসি / আইফোর্ট সংকলকগুলি ডাউনলোড করেছি এবং পরীক্ষাগুলি নিজেই করেছি। এই নতুন ফলাফলগুলি অন্তর্ভুক্ত করার জন্য প্রশ্নটি আপডেট করা হয়েছে, অর্থাৎ ইন্টেলের স্বতঃসংশ্লিষ্টকরণ ফোর্টরান এবং সি উভয় ক্ষেত্রেই কাজ করে
পেড্রো

1
ধন্যবাদ। হ্যাঁ আমি লক্ষ করেছি যে লুপগুলি সহজ এবং অপারেশনগুলি স্তর 1 বিএলএএস হওয়ায় সম্ভবত সামান্য পার্থক্য রয়েছে। তবে আমি যেমন পূর্বে বলেছিলাম ফোরট্রানের পুরো অ্যারে ক্রিয়াকলাপ সম্পাদন করার ক্ষমতা এবং বিশুদ্ধ / এলিমেন্টালের মতো কীওয়ার্ডগুলির ব্যবহারের সংকলক অপ্টিমাইজেশনের জন্য আরও জায়গা রয়েছে। সংকলকগণ কীভাবে এই তথ্য ব্যবহার করে এবং এটি সত্যিই কী করে তা আলাদা জিনিস। এছাড়াও আপনি matmul চেষ্টা করতে পারেন যদি আপনি চান bpaste.net/show/23035
stali

6

আমি মনে করি, এটি কেবল আকর্ষণীয়ই নয় যে একটি কম্পাইলার কীভাবে আধুনিক হার্ডওয়্যারগুলির জন্য কোডটি অনুকূল করে। বিশেষত জিএনইউ সি এবং জিএনইউ ফোর্টরানের মধ্যে কোড উত্পন্ন খুব আলাদা হতে পারে।

সুতরাং আসুন তাদের মধ্যে পার্থক্য দেখানোর জন্য আরও একটি উদাহরণ বিবেচনা করুন।

জটিল সংখ্যা ব্যবহার করে, জিএনইউ সি সংকলক একটি জটিল সংখ্যায় প্রায় খুব বেসিক গাণিতিক অপারেশনের জন্য একটি বৃহত ওভারহেড উত্পাদন করে। ফোর্টরান সংকলক আরও ভাল কোড দেয়। আসুন ফোরট্রানে নিম্নলিখিত ছোট উদাহরণটি একবার দেখুন:

COMPLEX*16 A,B,C
C=A*B

দেয় (গফর্ট্রান -জি-কমপ্লেক্স.ফো-সি কমপ্লেক্স.ফ 95 ;জেজডাম্প-ডি -এস কমপ্লেক্স.ফো):

C=A*B
  52:   dd 45 e0                fldl   -0x20(%ebp)
  55:   dd 45 e8                fldl   -0x18(%ebp)
  58:   dd 45 d0                fldl   -0x30(%ebp)
  5b:   dd 45 d8                fldl   -0x28(%ebp)
  5e:   d9 c3                   fld    %st(3)
  60:   d8 ca                   fmul   %st(2),%st
  62:   d9 c3                   fld    %st(3)
  64:   d8 ca                   fmul   %st(2),%st
  66:   d9 ca                   fxch   %st(2)
  68:   de cd                   fmulp  %st,%st(5)
  6a:   d9 ca                   fxch   %st(2)
  6c:   de cb                   fmulp  %st,%st(3)
  6e:   de e9                   fsubrp %st,%st(1)
  70:   d9 c9                   fxch   %st(1)
  72:   de c2                   faddp  %st,%st(2)
  74:   dd 5d c0                fstpl  -0x40(%ebp)
  77:   dd 5d c8                fstpl  -0x38(%ebp)

যা 39 বাইট মেশিন কোড। আমরা যখন সি তে একই বিবেচনা করি

 double complex a,b,c; 
 c=a*b; 

এবং আউটপুট একবার দেখুন (উপরের মত একই ভাবে সম্পন্ন), আমরা পেতে:

  41:   8d 45 b8                lea    -0x48(%ebp),%eax
  44:   dd 5c 24 1c             fstpl  0x1c(%esp)
  48:   dd 5c 24 14             fstpl  0x14(%esp)
  4c:   dd 5c 24 0c             fstpl  0xc(%esp)
  50:   dd 5c 24 04             fstpl  0x4(%esp)
  54:   89 04 24                mov    %eax,(%esp)
  57:   e8 fc ff ff ff          call   58 <main+0x58>
  5c:   83 ec 04                sub    $0x4,%esp
  5f:   dd 45 b8                fldl   -0x48(%ebp)
  62:   dd 5d c8                fstpl  -0x38(%ebp)
  65:   dd 45 c0                fldl   -0x40(%ebp)
  68:   dd 5d d0                fstpl  -0x30(%ebp)

যা 39 বাইট মেশিন কোডও, তবে ফাংশন ধাপ 57 উল্লেখ করে, কাজের সঠিক অংশটি করে এবং পছন্দসই অপারেশন সম্পাদন করে। সুতরাং মাল্টি অপারেশন চালানোর জন্য আমাদের কাছে 27 বাইট মেশিন কোড রয়েছে। পিছনে ফাংশনটি muldc3 সরবরাহ libgcc_s.soকরেছে এবং মেশিন কোডে 1375 বাইটের একটি পদচিহ্ন রয়েছে। এটি কোডটি নাটকীয়ভাবে কমিয়ে দেয় এবং কোনও প্রোফাইলার ব্যবহার করার সময় একটি আকর্ষণীয় আউটপুট দেয়।

যখন আমরা উপরের বিএলএএস উদাহরণগুলি প্রয়োগ করি zaxpyএবং একই পরীক্ষা করি, ফোর্টরান সংকলকটি সি সংকলকটির চেয়ে ভাল ফলাফল দেয়।

(আমি এই পরীক্ষার জন্য জিসিসি ৪.৪.৩ ব্যবহার করেছি, তবে আমি এই আচরণটি অন্য একটি জিসি-র দ্বারা প্রকাশিত লক্ষ্য করেছি))

সুতরাং আমার মতে আমরা কেবল প্যারালাইজেশন এবং ভেক্টরাইজেশন সম্পর্কে চিন্তা করি না যখন কোনটি আরও ভাল সংকলক হয় সে সম্পর্কে আমাদেরও দেখতে হবে বেসিক জিনিসগুলি কীভাবে এসেম্বলারের কোডে অনুবাদ করা হয়। যদি এই অনুবাদটি খারাপ কোড দেয় তবে অপটিমাইজেশন কেবল এই জিনিসগুলিকে ইনপুট হিসাবে ব্যবহার করতে পারে।


1
আমি আপনার কোডের লাইন বরাবর একটি উদাহরণ রান্না করেছি complex.cএবং এটি অনলাইনে কোডে যুক্ত করেছি। কিছুই অপ্টিমাইজড না হয়েছে তা নিশ্চিত করতে আমাকে সমস্ত ইনপুট / আউটপুট যুক্ত করতে হয়েছিল। আমি __muldc3যদি না ব্যবহার করি তবে কেবলমাত্র আমি কল পাই -ffast-math। সাথে -O2 -ffast-mathআমি 9 লাইনের ইনিল্ড এসেম্বারলার পেয়েছি। আপনি এটা নিশ্চিত করতে পারেন?
পেড্রো

উত্পাদিত এসেম্বেবলারের মধ্যে পার্থক্যের জন্য আমি আরও নির্দিষ্ট কারণ খুঁজে পেয়েছি এবং এটি উপরে আমার প্রশ্নের সাথে যুক্ত করেছি।
পেড্রো

-O2 ব্যবহার করে রানটাইম সময়ে প্রতিটি যা সম্ভব তা গণনা করতে সংকলককে নেতৃত্ব দেয়, এ কারণেই এই জাতীয় নির্মাণগুলি কখনও কখনও হারিয়ে যায়। -আপনি ফলাফলের উপর নির্ভর করতে চাইলে বৈজ্ঞানিক কম্পিউটিংয়ে -ফ্যাসট-ম্যাথ বিকল্পটি ব্যবহার করা উচিত নয়।
এমকে ওরফে গ্রিসু

1
ঠিক আছে, সেই যুক্তি অনুসারে (না -ffast-math) আপনার জটিল মূল্যবান গণনাগুলির জন্য ফোর্টরান ব্যবহার করা উচিত নয়। আমি আমার প্রশ্নের আপডেটে যেমন বর্ণনা করেছি -ffast-mathবা আরও সাধারণভাবে, -fcx-limited-rangeজিসিসি-কে একই নন-আইইইই, সীমাবদ্ধ রেঞ্জের কম্পিউটেশনগুলি ফরট্রানের মান হিসাবে ব্যবহার করতে বাধ্য করে । সুতরাং আপনি যদি জটিল মানগুলির সঠিক পরিসীমা এবং সঠিক ইনফস এবং ন্যানগুলি চান, তবে আপনার ফোর্টরান ব্যবহার করা উচিত নয় ...
পেড্রো

2
@ পেড্রো: আপনি যদি জিসিসি GFortran আর্টির মতো আচরণ করতে চান। জটিল গুণ এবং বিভাগ, আপনার -fcx-fortran-নিয়ম ব্যবহার করা উচিত।
জান্নেব

4

ভাবেন,

আমি এই আলোচনাটি খুব আকর্ষণীয় বলে মনে করেছি, কিন্তু আমি অবাক হয়ে দেখেছি যে মাতমুলের উদাহরণে লুপগুলি পুনরায় অর্ডার করার ফলে চিত্রটি বদলে গেছে। আমার আমার বর্তমান মেশিনে কোনও ইন্টেল সংকলক উপলব্ধ নেই, তাই আমি গফর্ট্রান ব্যবহার করছি, তবে মিমি_স্টেস্ট.ফ 90 থেকে লুপগুলির একটি পুনর্লিখন

call cpu_time(start)  
do r=1,runs  
  mat_c=0.0d0  
     do j=1,n  
        do k=1,n  
  do i=1,n  
           mat_c(i,j)=mat_c(i,j)+mat_a(i,k)*mat_b(k,j)  
        end do  
     end do  
  end do  
end do  
call cpu_time(finish)  

আমার মেশিনের পুরো ফলাফল পরিবর্তন করে।

পূর্ববর্তী সংস্করণ টাইমিংয়ের ফলাফলগুলি ছিল:

#time ./mm_test_f 10000 100
 matmul    time   6.3620000000000001     
 triple do time   21.420999999999999     

তবুও ট্রিপল লুপগুলি উপরের ইয়েল্ডের মতো পুনরায় সাজানো হয়েছে:

#time ./mm_test_f 10000 100
 matmul    time   6.3929999999999998     
 triple do time   3.9190000000000005    

এটি ইন্টেল (আর) কোর (টিএম) i7-2600K সিপিইউতে 3.40GHz এ জিসিসি / গফর্ট্রান 4.7.2 20121109

সংকলক পতাকাগুলি ব্যবহৃত হয়েছিল সেগুলি মেকফাইল থেকে আমি এখানে পেয়েছি ...


3
এটি আশ্চর্যের নয়, যেহেতু মেমরির ম্যাট্রিক্স স্টোরেজটি একটি আদেশের পক্ষে, অর্থাত্, যদি সারিগুলি স্বচ্ছভাবে সংরক্ষণ করা হয় তবে সারিগুলির অভ্যন্তরে সবচেয়ে লুপ করা ভাল, তারপরে আপনি বারবার লোডের তুলনায় প্রতিটি সারিটি দ্রুত স্থানীয় মেমোরিতে একবার লোড করতে পারেন (এর টুকরো ) এটি একটি একক উপাদান অ্যাক্সেস করতে। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 9595৯৫৫66 দেখুন ।
ক্রিশ্চান ক্ল্যাসন

আমার ধারণা আমি অবাক হয়ে গিয়েছিলাম যে "অভ্যন্তরীণ ম্যাটমুল" এইভাবে কিছু করতে কোড করা হবে না। ট্রিপল দ্বিতীয়ভাবে অর্ডার করার সাথে এটি যথেষ্ট গতিযুক্ত। এটি এই সংকলক সেটটিতে উপস্থিত বলে মনে হচ্ছে, পূর্বের গফর্ট্রান সংস্করণগুলি তাদের সময়সীমার চেয়ে আরও "সমতল" হতে পারে - আপনি কোন উপায়ে যেভাবে কাজ করেছিলেন তা বিবেচ্য হয়নি - এটি প্রায় একই সময় নিয়েছিল।
স্কাতজি

-2

এটি এমন ভাষা নয় যা কোডগুলি দ্রুত চালিত করে, যদিও তারা সাহায্য করে। এটি সংকলক, সিপিইউ এবং অপারেটিং সিস্টেম যা কোডগুলিকে দ্রুত চালিত করে। ভাষার তুলনা করা কেবলমাত্র একটি ভুল, অকেজো এবং অর্থহীন। আপনি যে দুটি ভেরিয়েবলের সাথে তুলনা করছেন তা ভাষা এবং সংকলকটির অর্থহীন নয়। যদি একটি কোড দ্রুত চলে, আপনি জানেন না এটি কতটা ভাষা বা সংকলকটি কত। কম্পিউটার বিজ্ঞান সম্প্রদায় কেবল এটি বুঝতে পারে না তা আমি বুঝতে পারি না :-(

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.