SYCL
یکی از جالب ترین و البته سخت ترین سناریو ها در HPC برنامه نویسی برای محیطی هست که شامل چندین دیوایس مختلف باشه. مثلا فرض کنید با سیستمی طرف هستیم که یک CPU با 128 هسته و 4 تا GPU داره و قصد داریم یک برنامه برای همچین محیطی توسعه بدیم. برای همچین کاری اصطلاح Heterogeneous computing رو هم بکار می برن.
حالا چطور باید برناممون رو توسعه بدیم که بتونیم از تمام امکانات سخت افزاری این سیستم استفاده کنیم؟ یک راه طبیعی اینه که کد قسمت هایی از برنامه که با GPU سر و کار دارند رو با CUDA بنویسیم و برای استفاده از هسته های CPU هم از یک کتابخانه مثلا TBB استفاده کنیم.
این مدل برنامه نویسی کار میکنه اما چندتا ایراد داره. ایراد اصلی اینه که فرض کنید تصمیم میگیریم همین کد رو روی یک سیستم دیگه اجرا کنیم که GPU نداره و حالا مجبوریم تمام قسمت هایی از کد که با CUDA نوشته بودیم رو یکبار دیگه برای CPU بنویسیم.
استاندارد SYCL برای حل همچین مشکلاتی تدوین شده و بهمون اجازه میده با یک interface یکپارچه برای دیوایس های مختلف مثل CPU یا GPU برنامه بنویسیم.
@hpcnerds
یکی از جالب ترین و البته سخت ترین سناریو ها در HPC برنامه نویسی برای محیطی هست که شامل چندین دیوایس مختلف باشه. مثلا فرض کنید با سیستمی طرف هستیم که یک CPU با 128 هسته و 4 تا GPU داره و قصد داریم یک برنامه برای همچین محیطی توسعه بدیم. برای همچین کاری اصطلاح Heterogeneous computing رو هم بکار می برن.
حالا چطور باید برناممون رو توسعه بدیم که بتونیم از تمام امکانات سخت افزاری این سیستم استفاده کنیم؟ یک راه طبیعی اینه که کد قسمت هایی از برنامه که با GPU سر و کار دارند رو با CUDA بنویسیم و برای استفاده از هسته های CPU هم از یک کتابخانه مثلا TBB استفاده کنیم.
این مدل برنامه نویسی کار میکنه اما چندتا ایراد داره. ایراد اصلی اینه که فرض کنید تصمیم میگیریم همین کد رو روی یک سیستم دیگه اجرا کنیم که GPU نداره و حالا مجبوریم تمام قسمت هایی از کد که با CUDA نوشته بودیم رو یکبار دیگه برای CPU بنویسیم.
استاندارد SYCL برای حل همچین مشکلاتی تدوین شده و بهمون اجازه میده با یک interface یکپارچه برای دیوایس های مختلف مثل CPU یا GPU برنامه بنویسیم.
@hpcnerds
👍6
HPC Nerds | High Performance and Scientific Computing
SYCL یکی از جالب ترین و البته سخت ترین سناریو ها در HPC برنامه نویسی برای محیطی هست که شامل چندین دیوایس مختلف باشه. مثلا فرض کنید با سیستمی طرف هستیم که یک CPU با 128 هسته و 4 تا GPU داره و قصد داریم یک برنامه برای همچین محیطی توسعه بدیم. برای همچین کاری…
همونطور میشه حدس زد پیاده سازی همچین استانداردی کار راحتی نیست چون مدل برنامه نویسی CPU و GPU تفاوت چشمگیری داره.
کامپایلر Data Parallel C++ یکی از کامپایلر هایی هست که موفق شده استاندارد SYCL رو پیاده سازی و پشتیبانی کنه. اینتل این کامپایلر رو مخصوص نیاز های HPC توسعه داده و الان به عنوان یکی از ابزار های مجموعه Intel OneAPI قابل استفاده هست.
@hpcnerds
کامپایلر Data Parallel C++ یکی از کامپایلر هایی هست که موفق شده استاندارد SYCL رو پیاده سازی و پشتیبانی کنه. اینتل این کامپایلر رو مخصوص نیاز های HPC توسعه داده و الان به عنوان یکی از ابزار های مجموعه Intel OneAPI قابل استفاده هست.
@hpcnerds
👍4
اگه دوست دارید بدونید مدل برنامه نویسی با SYCL به چه صورت هست این ارائه ممکنه واستون جالب باشه
https://www.youtube.com/watch?v=8Cs_uI-O51s
@hpcnerds
https://www.youtube.com/watch?v=8Cs_uI-O51s
@hpcnerds
YouTube
GPU Performance Portability Using Standard C++ with SYCL - Hugh Delaney & Rod Burns - CppCon 2022
https://cppcon.org/
---
GPU Performance Portability Using Standard C++ with SYCL - Hugh Delaney & Rod Burns - CppCon 2022
https://github.com/CppCon/CppCon2022
The proliferation of accelerators, in particular GPUs, over the past decade is impacting the…
---
GPU Performance Portability Using Standard C++ with SYCL - Hugh Delaney & Rod Burns - CppCon 2022
https://github.com/CppCon/CppCon2022
The proliferation of accelerators, in particular GPUs, over the past decade is impacting the…
👍4
چطور کتابخانه های C++ رو نصب و استفاده کنیم؟
خیلی وقت ها که یه کتابخونه برای C++ معرفی میکنم ازم میپرسن چطور باید یک کتابخونه که جز کتابخانه های استاندارد C++ نیست رو نصب و استفاده کنیم.
برای استفاده بدون ابهام و مشکل از C++ و کتابخانه هایی که واسش توسعه پیدا کرده لازم هست با چندتا مفهوم و ابزار مهم آشنا بشیم که در ادامه اونا رو میگم.
1⃣ یاد بگیریم بدون IDE و مستقیما با استفاده از یک کامپایلر مثل GCC کدمون رو کامپایل کنیم.
2⃣ با مفهموم کتابخانه های static و dynamic آشنا بشیم و یاد بگیریم که چطور با کامپایلر یک کتابخونه رو به کدی که نوشیم لینک کنیم.
3⃣ وقتی پروژمون کمی بزرگ بشه و تعداد کتابخونه هایی که استفاده میکنیم بیشتر، نوشتن مستقیم دستورات برای کامپایلر کار طاقت فرسایی میشه. تو این مرحله نیاز داریم کار با یک build system مثل CMake رو یاد بگیریم. الان مدیریت پروژه و لینک کردن کتابخونه ها واسمون راحت تر میشه
https://cmake.org/getting-started/
چند سال پیش این موارد رو تو این دو تا فیلم توضیح دادم:
https://www.aparat.com/v/6xrj8
https://www.aparat.com/v/p17z1e3
4⃣ هنوز مجبوریم کتابخونه ها رو دستی نصب کنیم . پس برای ساده تر کردن کارمون میتونیم از یک package manager هم در کنار CMake استفاده کنیم تا نصب و مدیریت نیازمندی ها رو هم خودکار انجام بدیم. بر خلاف زبان های Julia و یا پایتون ، زبان C++ یک package manager رسمی نداره اما گزینه های غیر رسمی خوبی وجود داره که من به شخصه vcpkg رو دوست دارم
https://vcpkg.io/en/
#cpp
@hpcnerds
خیلی وقت ها که یه کتابخونه برای C++ معرفی میکنم ازم میپرسن چطور باید یک کتابخونه که جز کتابخانه های استاندارد C++ نیست رو نصب و استفاده کنیم.
برای استفاده بدون ابهام و مشکل از C++ و کتابخانه هایی که واسش توسعه پیدا کرده لازم هست با چندتا مفهوم و ابزار مهم آشنا بشیم که در ادامه اونا رو میگم.
1⃣ یاد بگیریم بدون IDE و مستقیما با استفاده از یک کامپایلر مثل GCC کدمون رو کامپایل کنیم.
2⃣ با مفهموم کتابخانه های static و dynamic آشنا بشیم و یاد بگیریم که چطور با کامپایلر یک کتابخونه رو به کدی که نوشیم لینک کنیم.
3⃣ وقتی پروژمون کمی بزرگ بشه و تعداد کتابخونه هایی که استفاده میکنیم بیشتر، نوشتن مستقیم دستورات برای کامپایلر کار طاقت فرسایی میشه. تو این مرحله نیاز داریم کار با یک build system مثل CMake رو یاد بگیریم. الان مدیریت پروژه و لینک کردن کتابخونه ها واسمون راحت تر میشه
https://cmake.org/getting-started/
چند سال پیش این موارد رو تو این دو تا فیلم توضیح دادم:
https://www.aparat.com/v/6xrj8
https://www.aparat.com/v/p17z1e3
4⃣ هنوز مجبوریم کتابخونه ها رو دستی نصب کنیم . پس برای ساده تر کردن کارمون میتونیم از یک package manager هم در کنار CMake استفاده کنیم تا نصب و مدیریت نیازمندی ها رو هم خودکار انجام بدیم. بر خلاف زبان های Julia و یا پایتون ، زبان C++ یک package manager رسمی نداره اما گزینه های غیر رسمی خوبی وجود داره که من به شخصه vcpkg رو دوست دارم
https://vcpkg.io/en/
#cpp
@hpcnerds
cmake.org
Getting Started with CMake
Using CMake shouldn’t be hard. We want to give you the resources you need to confidently leverage CMake as your build system of choice. The resources below will help you begin your CMake journey.
❤7👍2🙏1
BLAS
به سختی میشه مسئله ای در محاسبات علمی نام برد که نیازی به محاسبات ماتریسی نداشته باشه. چون این عملیات ها زیربنای بقیه محاسبات هستن، حتی کوچکترین بهبود در سرعت عملکرد اون ها میتونه برای خیلی از بیزینس ها ارزش زیادی به همراه داشته باشه. سال ۱۹۷۹ یک پیاده سازی از عملیات های اساسی جبرخطی به نام BLAS برای زبان فرترن منتشر شد:
🔴 BLAS :: Basic Linear Algebra Subprograms
https://www.netlib.org/blas/
این پیاده سازی بعد از یه مدت به یه استاندارد محبوب تبدیل شد و خیلی ها سعی کردن سریع ترین پیاده سازی ممکن از این استاندارد رو توسعه بدن، رقابتی که امروز هم در جریانه. چندتا از پیاده سازی های معروف BLAS برای CPU اینا هستن:
🔴 OpenBLAS
https://github.com/OpenMathLib/OpenBLAS
🔴 Intel MKL
https://github.com/oneapi-src/oneMKL
🔴 Eigen
http://eigen.tuxfamily.org/
🔴 ATLAS
https://github.com/math-atlas/math-atlas
و برای GPU هم معروف ترین پیاده سازی cuBLAS هست که توسط Nvidia ارائه شده.
🔴 cuBLAS
https://docs.nvidia.com/cuda/cublas/
چون پیاده سازی کارآمد این استاندارد کار راحتی نیست، اغلب ابزار هایی که با محاسبات ماتریسی سر و کار دارن از همین کتابخونه ها استفاده میکنن. مثلا کتابخانه Numpy رو وقتی نصب میکنید ، روی سیستم شما دنبال یک پیاده سازی از BLAS می گرده و از همون استفاده میکنه. به عنوان نمونه، روی سیستم من Numpy داره از OpenBlas و PyTorch داره از MKL استفاده میکنه.
اما استاندارد BLAS دقیقا چطوریه؟
تو این استاندارد، عملیات های پایه ماتریسی به سه گروه تقسیم بندی میشن:
🟢 BLAS Level 1
عملیات هایی که روی دو بردار انجام میشن. مثلا جمع دوتا بردار
🟢 BLAS Level 2
عملیات هایی که روی یک بردار و یک ماتریس انجام میشه مثل ضرب یک ماتریس در یک بردار
🟢 BLAS Level 3
عملیات هایی که روی دوتا ماتریس انجام میشه مثل ضرب کردنشون
یک نکته که شاید واستون جالب باشه اینه که با هدف بدست آوردن بیشترین سرعت ممکن، معمولا عملیات های هر سطح از نو پیاده سازی میشن و اینطور نیست که مثلا در پیاده سازی عملیات های سطح ۳ بیایم از عملیات های سطح ۲ استفاده کنیم! یکی از موضوعات داغ ریسرچ در این زمینه تولید خودکار کد کارآمد این عملیات ها برای هر سخت افزار و حتی برای اندازه های خاصی از ماتریس ها هست.
بنظرم تلاش برای پیاده سازی این روتین ها و مقایسه با پیاده سازی های موجود یکی از بهترین روش ها برای تمرین HPC هست. این پیاده سازی ها در طول سال ها بهبود پیدا کرده و با خوندن سورس کد اون ها میشه ریزه کاری هایی از محاسبات عددی و HPC رو یاد گرفت که در هیچ کتاب یا کورسی پیدا نمیشه.
@hpcnerds
به سختی میشه مسئله ای در محاسبات علمی نام برد که نیازی به محاسبات ماتریسی نداشته باشه. چون این عملیات ها زیربنای بقیه محاسبات هستن، حتی کوچکترین بهبود در سرعت عملکرد اون ها میتونه برای خیلی از بیزینس ها ارزش زیادی به همراه داشته باشه. سال ۱۹۷۹ یک پیاده سازی از عملیات های اساسی جبرخطی به نام BLAS برای زبان فرترن منتشر شد:
🔴 BLAS :: Basic Linear Algebra Subprograms
https://www.netlib.org/blas/
این پیاده سازی بعد از یه مدت به یه استاندارد محبوب تبدیل شد و خیلی ها سعی کردن سریع ترین پیاده سازی ممکن از این استاندارد رو توسعه بدن، رقابتی که امروز هم در جریانه. چندتا از پیاده سازی های معروف BLAS برای CPU اینا هستن:
🔴 OpenBLAS
https://github.com/OpenMathLib/OpenBLAS
🔴 Intel MKL
https://github.com/oneapi-src/oneMKL
🔴 Eigen
http://eigen.tuxfamily.org/
🔴 ATLAS
https://github.com/math-atlas/math-atlas
و برای GPU هم معروف ترین پیاده سازی cuBLAS هست که توسط Nvidia ارائه شده.
🔴 cuBLAS
https://docs.nvidia.com/cuda/cublas/
چون پیاده سازی کارآمد این استاندارد کار راحتی نیست، اغلب ابزار هایی که با محاسبات ماتریسی سر و کار دارن از همین کتابخونه ها استفاده میکنن. مثلا کتابخانه Numpy رو وقتی نصب میکنید ، روی سیستم شما دنبال یک پیاده سازی از BLAS می گرده و از همون استفاده میکنه. به عنوان نمونه، روی سیستم من Numpy داره از OpenBlas و PyTorch داره از MKL استفاده میکنه.
اما استاندارد BLAS دقیقا چطوریه؟
تو این استاندارد، عملیات های پایه ماتریسی به سه گروه تقسیم بندی میشن:
🟢 BLAS Level 1
عملیات هایی که روی دو بردار انجام میشن. مثلا جمع دوتا بردار
🟢 BLAS Level 2
عملیات هایی که روی یک بردار و یک ماتریس انجام میشه مثل ضرب یک ماتریس در یک بردار
🟢 BLAS Level 3
عملیات هایی که روی دوتا ماتریس انجام میشه مثل ضرب کردنشون
یک نکته که شاید واستون جالب باشه اینه که با هدف بدست آوردن بیشترین سرعت ممکن، معمولا عملیات های هر سطح از نو پیاده سازی میشن و اینطور نیست که مثلا در پیاده سازی عملیات های سطح ۳ بیایم از عملیات های سطح ۲ استفاده کنیم! یکی از موضوعات داغ ریسرچ در این زمینه تولید خودکار کد کارآمد این عملیات ها برای هر سخت افزار و حتی برای اندازه های خاصی از ماتریس ها هست.
بنظرم تلاش برای پیاده سازی این روتین ها و مقایسه با پیاده سازی های موجود یکی از بهترین روش ها برای تمرین HPC هست. این پیاده سازی ها در طول سال ها بهبود پیدا کرده و با خوندن سورس کد اون ها میشه ریزه کاری هایی از محاسبات عددی و HPC رو یاد گرفت که در هیچ کتاب یا کورسی پیدا نمیشه.
@hpcnerds
👍8❤1
یکی از کله گنده ترین پروژه های متن باز در حال توسعه برای محاسبات عددی روی سوپرکامپیوتر ها و کلاستر های HPC پروژه Trilinos هست. این پروژه الگوریتم های پرتکرار در مسائل محاسبات عددی رو به صورت توزیع شده و سازگار با MPI ارائه میده.
در حقیقت Trilinos از چند تا زیر پروژه تشکیل شده که چندتاش رو نام میبرم:
🔴 پکیج Tpetra | محاسبات پایه ماتریسی به صورت موازی
🔴 پکیج Amesos | حل دستگاه های خطی sparse
🔴 پکیج Belos | حل دستگاه ها با روش های iterative
🔴 پکیج Anasazi | حل مسائل مقدارویژه
قطعا میتونیم با یه سرچ ساده تعداد زیادی پروژه پیدا کنیم که این کار ها رو انجام میدن ولی کمتر پروژه ای هست که به این اندازه scalable باشه و بتونیم روی یک کلاستر HPC ازش استفاده کنیم. میتونید یه سری آموزش برای شروع کار با Trilinos اینجا پیدا کنید:
https://trilinos.github.io/documentation.html
یادمه یه ورکشاپ مختصر هم دو سال پیش گذاشته بودن که احتمالا فیلم هاش رو بتونید روی یوتیوب پیدا کنید.
@hpcnerds
در حقیقت Trilinos از چند تا زیر پروژه تشکیل شده که چندتاش رو نام میبرم:
🔴 پکیج Tpetra | محاسبات پایه ماتریسی به صورت موازی
🔴 پکیج Amesos | حل دستگاه های خطی sparse
🔴 پکیج Belos | حل دستگاه ها با روش های iterative
🔴 پکیج Anasazi | حل مسائل مقدارویژه
قطعا میتونیم با یه سرچ ساده تعداد زیادی پروژه پیدا کنیم که این کار ها رو انجام میدن ولی کمتر پروژه ای هست که به این اندازه scalable باشه و بتونیم روی یک کلاستر HPC ازش استفاده کنیم. میتونید یه سری آموزش برای شروع کار با Trilinos اینجا پیدا کنید:
https://trilinos.github.io/documentation.html
یادمه یه ورکشاپ مختصر هم دو سال پیش گذاشته بودن که احتمالا فیلم هاش رو بتونید روی یوتیوب پیدا کنید.
@hpcnerds
❤1👍1
چطور با C++ نمودار بکشیم؟
یه کتابخانه مشابه matplotlib برای C++ هست به نام Matplot++ که اغلب نمودار هایی که ممکنه نیاز بشه رو میتونیم باهاش رسم کنیم:
🟢 Matplot++ | A C++ Graphics Library for Data Visualization
https://alandefreitas.github.io/matplotplusplus
@hpcnerds
یه کتابخانه مشابه matplotlib برای C++ هست به نام Matplot++ که اغلب نمودار هایی که ممکنه نیاز بشه رو میتونیم باهاش رسم کنیم:
🟢 Matplot++ | A C++ Graphics Library for Data Visualization
https://alandefreitas.github.io/matplotplusplus
@hpcnerds
👍5
برای استفاده از یک کلاستر HPC و یا یک سوپرکامپیوتر باید چه ابزار هایی رو بشناسیم؟
1⃣ Linux
سیستم عامل کلاستر های HPC همیشه یک توزیع لینوکس هست پس مطمئن بشیم حداقل دستورات لازم برای استقرار و اجرای پروژمون رو میدونیم.
2⃣ Slurm
کلاستر HPC مثل یه سرور عادی نیست! سعی نکنیم تا ترمینال سیستم واسمون باز شد همینطوری پروژمون رو اجرا کنیم. سروری که ما بهش متصل شدیم صرفا یک login node هست و اگه پروژمون رو همینطوری روش اجرا کنیم فقط از منابع سخت افزاری همون سرور میتونیم استفاده کنیم. منابع این کلاستر ها توسط یک workload manager مدیریت میشه که معروف ترین سیستم برای اینکار Slurm هست. روند استفاده اینطوریه که در یک فایل با فرمتی مشخص منابع سخت افزاری و برنامه های که پروژتون برای اجرا نیاز داره رو مشخص میکنید و یکسری موارد دیگه مثل اینکه اگه اجرا به خطا خورد چه اتفاقی بیفته. مثلاً میتونیم در اون فایل مشخص کنیم که پروژه ما به 64 هسته CPU و یک GPU احتیاج داره و نیازمندی نرم افزاریش هم python 3 است و نهایتا سه روز اجرا شدنش طول میکشه. وقتی یک job رو به این صورت ثبت کنیم، Slurm منابع مورد نیاز رو در صورت وجود از کلاستر برای اجرای این job اختصاص میده.
3⃣ Lmod
کاربرهای زیادی از یک سوپرکامپیوتر استفاده میکنند و هر کدوم ممکنه به نسخه خاصی از برنامه های مختلف احتیاج داشته باشند. وظیفه مدیریت این نیازمندی های نرم افزاری و لود کردن برنامه های مورد نیاز هر job به عهده Lmod هست. دستورات Lmod رو معمولا در همون فایل تعریف job قبل از دستورات اجرای پروژه می نویسیم. مثلاً
⚠️ هر کلاستر به کاربرهاش یکسری مستندات مبنی بر سیاست تخصیص منابع، سطوح دسترسی و ماژول های که میتونن استفاده کنند ارائه میده. این مستندات رو نادیده نگیریم.
@hpcnerds
1⃣ Linux
سیستم عامل کلاستر های HPC همیشه یک توزیع لینوکس هست پس مطمئن بشیم حداقل دستورات لازم برای استقرار و اجرای پروژمون رو میدونیم.
2⃣ Slurm
کلاستر HPC مثل یه سرور عادی نیست! سعی نکنیم تا ترمینال سیستم واسمون باز شد همینطوری پروژمون رو اجرا کنیم. سروری که ما بهش متصل شدیم صرفا یک login node هست و اگه پروژمون رو همینطوری روش اجرا کنیم فقط از منابع سخت افزاری همون سرور میتونیم استفاده کنیم. منابع این کلاستر ها توسط یک workload manager مدیریت میشه که معروف ترین سیستم برای اینکار Slurm هست. روند استفاده اینطوریه که در یک فایل با فرمتی مشخص منابع سخت افزاری و برنامه های که پروژتون برای اجرا نیاز داره رو مشخص میکنید و یکسری موارد دیگه مثل اینکه اگه اجرا به خطا خورد چه اتفاقی بیفته. مثلاً میتونیم در اون فایل مشخص کنیم که پروژه ما به 64 هسته CPU و یک GPU احتیاج داره و نیازمندی نرم افزاریش هم python 3 است و نهایتا سه روز اجرا شدنش طول میکشه. وقتی یک job رو به این صورت ثبت کنیم، Slurm منابع مورد نیاز رو در صورت وجود از کلاستر برای اجرای این job اختصاص میده.
3⃣ Lmod
کاربرهای زیادی از یک سوپرکامپیوتر استفاده میکنند و هر کدوم ممکنه به نسخه خاصی از برنامه های مختلف احتیاج داشته باشند. وظیفه مدیریت این نیازمندی های نرم افزاری و لود کردن برنامه های مورد نیاز هر job به عهده Lmod هست. دستورات Lmod رو معمولا در همون فایل تعریف job قبل از دستورات اجرای پروژه می نویسیم. مثلاً
module load gcc/14.1
⚠️ هر کلاستر به کاربرهاش یکسری مستندات مبنی بر سیاست تخصیص منابع، سطوح دسترسی و ماژول های که میتونن استفاده کنند ارائه میده. این مستندات رو نادیده نگیریم.
@hpcnerds
❤5👍1
دلیل سرعت کتابخانه هایی مثل BLAS چیه؟
دو روز پیش یک پست برای معرفی کلی استاندارد BLAS نوشتم.
کد بالا رو ببینید، فرض کنید هدفمون اینه که دو تا بردار رو با هم جمع کنیم. تابع اول یک روش بدیهی برای انجام این کار رو نشون میده و تابع دوم از OpenBLAS برای انجامش استفاده میکنه.
وقتی دو بردار به طول یک میلیارد رو با هر کدوم از این دو تا جمع کردم، پیاده سازی BLAS تقریبا 5.5 برابر سریع تر بود. اینم بگم که قبل از اجرا تعداد thread هایی که BLAS میتونه استفاده کنه رو به یک محدود کردم، پس این افزایش سرعت حاصل از multi threading نیست.
پس دقیقا چی شده 🤔؟
اغلب CPU ها در سطح سخت افزاری میتونن یک دستور رو همزمان روی چندتا داده کنار هم اجرا کنند که به این کار SIMD یا single instruction multiple data میگن. بسته به نوع CPU تو مثال ما اینکار میتونه افزایش سرعت 5 تا 10 برابری به همراه داشته باشه.
پیاده سازی های BLAS با ترکیب این تکنیک و multi-threading و استفاده بهینه از cache به همچین سرعتی دست پیدا میکنن
🔴 نگیم جمع دوتا بردار که کاری نداره از کد خودم استفاده میکنم
🔴 سخت افزاری که روش مینویسیم رو خوب بشناسیم
@hpcnerds
دو روز پیش یک پست برای معرفی کلی استاندارد BLAS نوشتم.
کد بالا رو ببینید، فرض کنید هدفمون اینه که دو تا بردار رو با هم جمع کنیم. تابع اول یک روش بدیهی برای انجام این کار رو نشون میده و تابع دوم از OpenBLAS برای انجامش استفاده میکنه.
وقتی دو بردار به طول یک میلیارد رو با هر کدوم از این دو تا جمع کردم، پیاده سازی BLAS تقریبا 5.5 برابر سریع تر بود. اینم بگم که قبل از اجرا تعداد thread هایی که BLAS میتونه استفاده کنه رو به یک محدود کردم، پس این افزایش سرعت حاصل از multi threading نیست.
پس دقیقا چی شده 🤔؟
پیاده سازی های BLAS با ترکیب این تکنیک و multi-threading و استفاده بهینه از cache به همچین سرعتی دست پیدا میکنن
🔴 نگیم جمع دوتا بردار که کاری نداره از کد خودم استفاده میکنم
🔴 سخت افزاری که روش مینویسیم رو خوب بشناسیم
@hpcnerds
👍4❤1🤨1
یکی از پیاده سازی های محبوب استاندارد SYCL پروژه hipSYCL بود که اخیرا مجبور شد اسمش رو به AdaptiveCpp تغییر بده. این پیاده سازی از CPU های مختلف، GPU های Nvidia و AMD پشتیبانی میکنه.
من تازگی ها یادگیری SYCL رو شروع کردم. اگه قصد دارید یاد بگیرید ، این پیاده سازی و پیاده سازی اینتل یعنی dpcpp گزینه های خوبی به نظر میان
https://github.com/AdaptiveCpp/AdaptiveCpp
@hpcnerds
من تازگی ها یادگیری SYCL رو شروع کردم. اگه قصد دارید یاد بگیرید ، این پیاده سازی و پیاده سازی اینتل یعنی dpcpp گزینه های خوبی به نظر میان
https://github.com/AdaptiveCpp/AdaptiveCpp
@hpcnerds
👍3❤2
فرض کنید یه پروژه با C++ توسعه دادیم که سرعت خیلی خوبی داره اما ممکنه استفاده از C++ برای اغلب کاربر های بالقوه این پروژه راحت نباشه. در مورد پروژه های محاسبات علمی که کاربر هاشون افراد آکادمیک هستن با این وضعیت زیاد مواجه میشیم.
حتما دیدید که خیلی از پروژه های معروف مثل PyTorch سورس اصلیشون با C++ توسعه پیدا کرده و البته به واسطه یه پکیج پایتون میتونیم از قابلیت اون ها استفاده کنیم.
اگه دنبال یه راه استاندارد برای همچین کاری هستید میتونید پروژه pybind رو استفاده کنید
https://pybind11.readthedocs.io/en/stable/
لازم به ذکره که PyTorch هم از همین برای ایجاد binding برای زبان پایتون استفاده کرده به جز یه سری موارد به خصوص که این پروژه کافی نبوده یا اینکه تو سرعت تاثیر منفی داشته.
@hpcnerds
حتما دیدید که خیلی از پروژه های معروف مثل PyTorch سورس اصلیشون با C++ توسعه پیدا کرده و البته به واسطه یه پکیج پایتون میتونیم از قابلیت اون ها استفاده کنیم.
اگه دنبال یه راه استاندارد برای همچین کاری هستید میتونید پروژه pybind رو استفاده کنید
https://pybind11.readthedocs.io/en/stable/
لازم به ذکره که PyTorch هم از همین برای ایجاد binding برای زبان پایتون استفاده کرده به جز یه سری موارد به خصوص که این پروژه کافی نبوده یا اینکه تو سرعت تاثیر منفی داشته.
@hpcnerds
❤5👍1
مشتق گیری خودکار به خاطر کاربرد هاش در deep learning و دقتی که در مقایسه با روش های تخمینی داره، الان دیگه به یک ابزار جدایی ناپذیر از محاسبات علمی تبدیل شده در نتیجه این روز ها یکی از موضوعات داغ ریسرچ توسعه سیستم های سریعتر و کارآمد تر برای انجامش هست.
از بین ایده ها و ترند هایی که در مورد این مسئله داره دنبال میشه، یه مورد جالب اینه که سعی کنیم مشتق گیری رو در زمان کامپایل انجام بدیم تا در زمان اجرا، مثل یک تابع عادی فقط مقدارش در یک نقطه خاص رو محاسبه کنیم. به جز افزایش سرعت بدیهی و کاهش نیاز به حافظه ، با اینکار میتونیم از قابلیت های code optimization کامپایلر ها هم برای بهینه کردن محاسبه مشتق استفاده کنیم.
یک پروژه که همچین ایده ای رو دنبال میکنه Enzyme هست:
https://enzyme.mit.edu/
الان در چند زبان از جمله C++ و Julia قابل استفاده است.
@hpcnerds
از بین ایده ها و ترند هایی که در مورد این مسئله داره دنبال میشه، یه مورد جالب اینه که سعی کنیم مشتق گیری رو در زمان کامپایل انجام بدیم تا در زمان اجرا، مثل یک تابع عادی فقط مقدارش در یک نقطه خاص رو محاسبه کنیم. به جز افزایش سرعت بدیهی و کاهش نیاز به حافظه ، با اینکار میتونیم از قابلیت های code optimization کامپایلر ها هم برای بهینه کردن محاسبه مشتق استفاده کنیم.
یک پروژه که همچین ایده ای رو دنبال میکنه Enzyme هست:
https://enzyme.mit.edu/
الان در چند زبان از جمله C++ و Julia قابل استفاده است.
@hpcnerds
enzyme.mit.edu
Enzyme AD
Enzyme Automatic Differentiation Framework
❤6👍1💯1
زبان C++ چطور توسعه پیدا میکنه؟
هر تغییری که قراره در C++ انجام بشه باید ابتدا در استاندارد این زبان تصویب و اضافه بشه. استاندارد زبان C++ قواعد و ویژگی های این زبان رو توصیف میکنه و کلا نقش قانونگذاری داره. مثلاً میگه که باید یه ساختمان داده به نام vector با فلان مشخصات وجود داشته باشه اما پیاده سازی مواردی که توصیف شده در استاندارد نمیاد.
پس اگه ما بخواهیم یه کتابخانه به C++ اضافه کنیم باید یک پروپوزال بنویسیم که پیشنهادات ما رو خیلی دقیق توصیف کنه. مثلاً این پروپوزال که اخیرا تحت بررسی کمیته استاندارد سازی هست، موضوعش اضافه کردن یک کتابخانه برای کار با گراف ها در C++ هست
🔴 P1709R5 | Graph Library
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p1709r5.pdf
این پروپوزال توسط 8 نفر پیشنهاد شده و چند سالی هست که تحت بررسی قرار گرفته و الان ویرایش پنجم داره نقد میشه. کمیته برای بررسی هر نوع پروپوزال یک زیر گروه مخصوص داره مثلاً پروپوزال بالا عمدتا توسط زیرگروه SG6 یا گروه مطالعاتی Numeric مورد نقد قرار میگیره. در کل پروپوزال های مربوط به محاسبات عددی میاد زیر دست اینا. کمیته استانداردسازی بسیار سخت گیره و تصویب یک پروپوزال به راحتی چندین سال طول میکشه و به عنوان نویسنده خیلی نرماله که قبل از تصویب پروپوزال بمیریم 😐. در طول این مدت پیشنهاد دهندگان پروپوزال میتونن پیاده سازی های غیر رسمی هم از کتابخانه ای که مطرح کردن، منتشر کنند تا با بازخوردی که از کاربرها و کمیته استاندارد سازی میگیرن کارشون رو بهبود بدن.
نهایتا وقتی تصویب شد کمیته اعلام میکنه که مثلاً از نسخه C++26 که سال 2026 منتشر میشه ، این پروپوزال دیگه رسما جزیی از زبان C++ هست . حالا پیاده سازی وظیفه توسعه دهنده های کامپایلر C++ هست که بهترین ها در نوع خودشون هستن. مثلاً وقتی کامپایلر GCC میگه ما در نسخه بعدی تمام ویژگی های C++26 رو پشتیبانی میکنیم، شامل تمام پروپوزال هایی که برای اون نسخه تصویب شدن هم میشه. البته معمولا هر کامپایلر ممکنه قابلیت هایی اضاف بر استاندارد هم پیاده سازی کنه که در اینصورت در مستندات گفته چه مواردی خارج از استاندارده.
اگه کنجکاوید میتونید لیست اعضای کمیته استاندارد سازی رو اینجا ببینید
https://isocpp.org/wiki/faq/wg21
@hpcnerds
هر تغییری که قراره در C++ انجام بشه باید ابتدا در استاندارد این زبان تصویب و اضافه بشه. استاندارد زبان C++ قواعد و ویژگی های این زبان رو توصیف میکنه و کلا نقش قانونگذاری داره. مثلاً میگه که باید یه ساختمان داده به نام vector با فلان مشخصات وجود داشته باشه اما پیاده سازی مواردی که توصیف شده در استاندارد نمیاد.
پس اگه ما بخواهیم یه کتابخانه به C++ اضافه کنیم باید یک پروپوزال بنویسیم که پیشنهادات ما رو خیلی دقیق توصیف کنه. مثلاً این پروپوزال که اخیرا تحت بررسی کمیته استاندارد سازی هست، موضوعش اضافه کردن یک کتابخانه برای کار با گراف ها در C++ هست
🔴 P1709R5 | Graph Library
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p1709r5.pdf
این پروپوزال توسط 8 نفر پیشنهاد شده و چند سالی هست که تحت بررسی قرار گرفته و الان ویرایش پنجم داره نقد میشه. کمیته برای بررسی هر نوع پروپوزال یک زیر گروه مخصوص داره مثلاً پروپوزال بالا عمدتا توسط زیرگروه SG6 یا گروه مطالعاتی Numeric مورد نقد قرار میگیره. در کل پروپوزال های مربوط به محاسبات عددی میاد زیر دست اینا. کمیته استانداردسازی بسیار سخت گیره و تصویب یک پروپوزال به راحتی چندین سال طول میکشه و به عنوان نویسنده خیلی نرماله که قبل از تصویب پروپوزال بمیریم 😐. در طول این مدت پیشنهاد دهندگان پروپوزال میتونن پیاده سازی های غیر رسمی هم از کتابخانه ای که مطرح کردن، منتشر کنند تا با بازخوردی که از کاربرها و کمیته استاندارد سازی میگیرن کارشون رو بهبود بدن.
نهایتا وقتی تصویب شد کمیته اعلام میکنه که مثلاً از نسخه C++26 که سال 2026 منتشر میشه ، این پروپوزال دیگه رسما جزیی از زبان C++ هست . حالا پیاده سازی وظیفه توسعه دهنده های کامپایلر C++ هست که بهترین ها در نوع خودشون هستن. مثلاً وقتی کامپایلر GCC میگه ما در نسخه بعدی تمام ویژگی های C++26 رو پشتیبانی میکنیم، شامل تمام پروپوزال هایی که برای اون نسخه تصویب شدن هم میشه. البته معمولا هر کامپایلر ممکنه قابلیت هایی اضاف بر استاندارد هم پیاده سازی کنه که در اینصورت در مستندات گفته چه مواردی خارج از استاندارده.
اگه کنجکاوید میتونید لیست اعضای کمیته استاندارد سازی رو اینجا ببینید
https://isocpp.org/wiki/faq/wg21
@hpcnerds
👍3❤1
برای سال ها محبوب ترین استاندارد برای انجام محاسبات توزیع شده MPI بوده.
یکی از پروژه های که سعی کرده جایگزین راحت تری به خصوص برای کاربرد های machine learning ارائه بده Ray هست
https://www.ray.io/
با قاطعیت نمیشه گفت ولی به نظر میاد OpenAI هم از Ray برای train مدل هاش استفاده میکنه.واسم جالب بود چون خودم اول حدس میزدم از MPI استفاده کرده باشن. به هر حال در این مورد اطلاعات زیادی منتشر نکرده.
به هر حال یادگیری Ray خیلی آسونه حتما امتحانش کنید.
@hpcnerds
یکی از پروژه های که سعی کرده جایگزین راحت تری به خصوص برای کاربرد های machine learning ارائه بده Ray هست
https://www.ray.io/
با قاطعیت نمیشه گفت ولی به نظر میاد OpenAI هم از Ray برای train مدل هاش استفاده میکنه.واسم جالب بود چون خودم اول حدس میزدم از MPI استفاده کرده باشن. به هر حال در این مورد اطلاعات زیادی منتشر نکرده.
به هر حال یادگیری Ray خیلی آسونه حتما امتحانش کنید.
@hpcnerds
Scale Machine Learning & AI Computing | Ray by Anyscale
Ray is an open source framework for managing, executing, and optimizing compute needs. Unify AI workloads with Ray by Anyscale. Try it for free today.
❤4👍1
چند سالی میشه که Intel داره روی یک مجموعه ابزار مخصوص HPC کار میکنه به نام oneAPI . بعضی از این ابزار ها قبلا کتابخانه های مستقل بودن ولی الان تحت برند oneAPI توسعه داده میشن. چندتا از ابزار های مهمی که داخل این مجموعه هستن اینان:
🔴 DPC++
این کامپایلر مخصوص Intel برای C++ هست که برای پشتیبانی از SYCL که قبلا در موردش گفتم، توسعه پیدا کرده.
🔴 OneTBB
این همون کتابخانه TBB هست که اومده زیرمجموعه OneAPI. یکی از بهترین گزینه ها و گزینه موردعلاقه خودم برای multi-threading در C++.
🔴 OneMKL
این یکی قبلا اسمش MKL بود و یک پیاده سازی تجاری از استاندارد BLAS بود که دیگه الان به صورت رایگان در دسترس هست.
🔴 OneDNN
شامل پیاده سازی های سطح پایین و با پرفرمنس بالا از اجزائی هست که برای پیاده سازی شبکه های عصبی احتیاج داریم. دقت کنید که یک framework کامل برای deep learning نیست و بیشتر بدرد کسی میخوره که خودش بخواد یک framework برای deep learning توسعه بده. یک رقیب احتمالی برای کتابخانه cuDNN که NVIDIA توسعه میده و الان تقریبا تمام کتابخانه های deep learning برای پشتیبانی از GPU دارن ازش استفاده میکنن.
@hpcnerds
🔴 DPC++
این کامپایلر مخصوص Intel برای C++ هست که برای پشتیبانی از SYCL که قبلا در موردش گفتم، توسعه پیدا کرده.
🔴 OneTBB
این همون کتابخانه TBB هست که اومده زیرمجموعه OneAPI. یکی از بهترین گزینه ها و گزینه موردعلاقه خودم برای multi-threading در C++.
🔴 OneMKL
این یکی قبلا اسمش MKL بود و یک پیاده سازی تجاری از استاندارد BLAS بود که دیگه الان به صورت رایگان در دسترس هست.
🔴 OneDNN
شامل پیاده سازی های سطح پایین و با پرفرمنس بالا از اجزائی هست که برای پیاده سازی شبکه های عصبی احتیاج داریم. دقت کنید که یک framework کامل برای deep learning نیست و بیشتر بدرد کسی میخوره که خودش بخواد یک framework برای deep learning توسعه بده. یک رقیب احتمالی برای کتابخانه cuDNN که NVIDIA توسعه میده و الان تقریبا تمام کتابخانه های deep learning برای پشتیبانی از GPU دارن ازش استفاده میکنن.
@hpcnerds
❤3👏2
در ایران برای دسترسی به سرور های محاسبات سنگین چه گزینه هایی داریم؟
فرض کنید که یک پروژه در حوزه محاسبات سنگین توسعه دادیم و قصد داریم عملکردش رو روی یک سیستم با تعداد هسته زیاد ارزیابی کنیم و یا یک سیستم میخواهیم که محاسبه نهایی پروژمون رو روش انجام بدیم.
سوپرکامپیوتر های خارج از ایران، روال استفادشون اینطوریه که یک پروپوزال بهشون میفرستیم و در صورت موافقت برای یه مدت بهمون دسترسی میدن و منابع محاسباتی قابل توجهی دارن مثلا LUMI که مال اتحادیه اروپاست:
https://lumi-supercomputer.eu/get-started/
اما خب همونطور که حدس میزنید، اگه داخل ایران باشیم همچنین گزینه لاکچری نداریم 🙄 خب داخل ایران چیا داریم؟ طبیعتا دانشگاه ها یک گزینه هستن، اغلب دانشگاه ها یه جایی به اسم مرکز محاسبات سریع یا یه چیزی تو همین مایه ها دارن و بعد از طی کردن ادا و اطوار بخصوصی بهمون دسترسی میدن، بعضی از اینها که خیلی ندیده و گدا هستن فقط به دانشجو های خودشون سرویس میدن و بعضی هاشون به بقیه هم با قیمت بیشتر خدمات میدن. یکسری مرکز هم هستن که کلا به صورت آزاد خدمات میدن و تخفیف دانشجویی هم دارن اغلب، با سرچ میتونید پیداشون کنید، خودم نمیگم که نگین داره تبلیغ میکنه :\ نرخ های استفاده رو ساعتی یا روزانه حساب میکنن معمولا. گاهی اوقات به یه سیستم زمانبدی که با ابزار هایی مثل slurm مدیریت میشه برای ثبت job هامون دسترسی میدن و بعضی هاشون هم کلا یک سرور مجازی با کانفیگی که نیاز داریم میدن.
مثلا در مواردی که یک سرور رو کلا در اختیارمون میذارن، بیشترین موردی که دیدم این بوده که یک سرور با 128 هسته CPU بهمون میداده. خب حالا اگه بیشتر نیاز داشتیم چطور؟ در اون صورت باید با متصل کردن هر تعداد سروری که جدا جدا میتونیم گیر بیاریم، یک کلاستر کوچیک ردیف کنیم 😐. مثلا اگه از MPI استفاده می کنید، میتونید دو یا تعداد بیشتری سرور با تعداد هسته بالا رو به صورت ساعتی اجاره و اون ها رو برای MPI به هم متصل و کانفیگ کنید. اگه وقت کنم بعدا در این مورد یک ویدئو ضبط میکنم و یه مثال از انجام این کار نشون میدم. این حرکت راه حل ایده آلی نیست. برای محاسبات طولانی مدت هزینه زیادی داره و البته انتظار سرعت پایین انتقال داده بین سرور ها رو باید داشته باشیم ولی برای مواقعی که صرفا قصد اجرای یک بنچمارک داریم یا یک محاسبه برای مدت نسبتا کوتاه، میتونه بهمون کمک کنه.
@hpcnerds
فرض کنید که یک پروژه در حوزه محاسبات سنگین توسعه دادیم و قصد داریم عملکردش رو روی یک سیستم با تعداد هسته زیاد ارزیابی کنیم و یا یک سیستم میخواهیم که محاسبه نهایی پروژمون رو روش انجام بدیم.
سوپرکامپیوتر های خارج از ایران، روال استفادشون اینطوریه که یک پروپوزال بهشون میفرستیم و در صورت موافقت برای یه مدت بهمون دسترسی میدن و منابع محاسباتی قابل توجهی دارن مثلا LUMI که مال اتحادیه اروپاست:
https://lumi-supercomputer.eu/get-started/
اما خب همونطور که حدس میزنید، اگه داخل ایران باشیم همچنین گزینه لاکچری نداریم 🙄 خب داخل ایران چیا داریم؟ طبیعتا دانشگاه ها یک گزینه هستن، اغلب دانشگاه ها یه جایی به اسم مرکز محاسبات سریع یا یه چیزی تو همین مایه ها دارن و بعد از طی کردن ادا و اطوار بخصوصی بهمون دسترسی میدن، بعضی از اینها که خیلی ندیده و گدا هستن فقط به دانشجو های خودشون سرویس میدن و بعضی هاشون به بقیه هم با قیمت بیشتر خدمات میدن. یکسری مرکز هم هستن که کلا به صورت آزاد خدمات میدن و تخفیف دانشجویی هم دارن اغلب، با سرچ میتونید پیداشون کنید، خودم نمیگم که نگین داره تبلیغ میکنه :\ نرخ های استفاده رو ساعتی یا روزانه حساب میکنن معمولا. گاهی اوقات به یه سیستم زمانبدی که با ابزار هایی مثل slurm مدیریت میشه برای ثبت job هامون دسترسی میدن و بعضی هاشون هم کلا یک سرور مجازی با کانفیگی که نیاز داریم میدن.
مثلا در مواردی که یک سرور رو کلا در اختیارمون میذارن، بیشترین موردی که دیدم این بوده که یک سرور با 128 هسته CPU بهمون میداده. خب حالا اگه بیشتر نیاز داشتیم چطور؟ در اون صورت باید با متصل کردن هر تعداد سروری که جدا جدا میتونیم گیر بیاریم، یک کلاستر کوچیک ردیف کنیم 😐. مثلا اگه از MPI استفاده می کنید، میتونید دو یا تعداد بیشتری سرور با تعداد هسته بالا رو به صورت ساعتی اجاره و اون ها رو برای MPI به هم متصل و کانفیگ کنید. اگه وقت کنم بعدا در این مورد یک ویدئو ضبط میکنم و یه مثال از انجام این کار نشون میدم. این حرکت راه حل ایده آلی نیست. برای محاسبات طولانی مدت هزینه زیادی داره و البته انتظار سرعت پایین انتقال داده بین سرور ها رو باید داشته باشیم ولی برای مواقعی که صرفا قصد اجرای یک بنچمارک داریم یا یک محاسبه برای مدت نسبتا کوتاه، میتونه بهمون کمک کنه.
@hpcnerds
👍7❤4
قبلا در مورد BLAS گفتم یکی از تکنیک هایی که پیاده سازی های سریع ازش استفاده قابل توجهی کردن SIMD هست و کلا در این مدل محاسبات خیلی موثر و پراستفاده است. حقیقت اینه که به علت وابستگی زیاد به سخت افزار انجام دادنش به صورت portable میتونه پر دردسرتر از موازی سازی در سطوح بالاتر باشه به همین خاطر منابع آموزشی زیادی برای یادگرفتنش نیست. به هر حال اگر دوست دارید شیوه انجامش در C++ رو یاد بگیرید، میتونید این آموزش از Sergey Slotin رو ببینید:
https://youtu.be/vIRjSdTCIEU?si=a2oT-lYFxWPGIkOQ
#cpp #cplusplus #SIMD
@hpcnerds
https://youtu.be/vIRjSdTCIEU?si=a2oT-lYFxWPGIkOQ
#cpp #cplusplus #SIMD
@hpcnerds
YouTube
The Art of SIMD Programming by Sergey Slotin
Modern hardware is highly parallel, but not only in terms of multiprocessing. There are many other forms of parallelism that, if used correctly, can greatly boost program efficiency — and without requiring more CPU cores. One such type of parallelism actively…
❤3👍2
این تیکه کد رو ببینید، وقتی اجرا بشه 7 تا عمل ضرب انجام میده:
به صورت پیشفرض کامپایلر GCC کد بالا رو دقیقا به همین صورتی که هست کامپایل میکنه. یکی از flag های بهینه سازی کد در GCC اینه که به صورت پیشفرض غیرفعاله:
اگه کدی که گفتم رو با این فلگ کامپایل کنیم، کامپایلر کد رو به یه همچین چیزی تبدیل میکنه تا تعداد ضرب ها رو از 7 به 3 کاهش بده:
وقتی این flag فعال باشه، کامپایلر سعی میکنه با بازی کردن با ترتیب عملیات های ریاضی داخل کد، سرعت رو افزایش بده. این البته مثال چرتی بود، مثال جالب تر اینه ممکنه یه حلقه رو بر این اساس بازنویسی کنه که اجراش سریعتر بشه. از اونجایی که به خاطر خطاهای عددی، ترتیب عمل هایی مثل ضرب و جمع میتونه نتیجه محاسبات رو عوض کنه، این flag به صورت پیشفرض غیرفعال هست. در کل GCC هشت تا flag برای بهینه سازی عملیات های پایه ریاضی داره که میتونید در پروژه هایی که شامل محاسبات عددی سنگین ولی نه چندان حساس به خطا هستن، استفاده کنید
استفاده از flag زیر معادل با فعال کردن همشونه:
تو این پست میتونید بخونید که هر کدوم از اینا دقیقا چیکار میکنن:
https://kristerw.github.io/2021/10/19/fast-math/
#cpp #gcc
@hpcnerds
x = x*x*x*x*x*x*x*x;
به صورت پیشفرض کامپایلر GCC کد بالا رو دقیقا به همین صورتی که هست کامپایل میکنه. یکی از flag های بهینه سازی کد در GCC اینه که به صورت پیشفرض غیرفعاله:
-fassociative-math
اگه کدی که گفتم رو با این فلگ کامپایل کنیم، کامپایلر کد رو به یه همچین چیزی تبدیل میکنه تا تعداد ضرب ها رو از 7 به 3 کاهش بده:
x *= x;
x *= x;
x *= x;
وقتی این flag فعال باشه، کامپایلر سعی میکنه با بازی کردن با ترتیب عملیات های ریاضی داخل کد، سرعت رو افزایش بده. این البته مثال چرتی بود، مثال جالب تر اینه ممکنه یه حلقه رو بر این اساس بازنویسی کنه که اجراش سریعتر بشه. از اونجایی که به خاطر خطاهای عددی، ترتیب عمل هایی مثل ضرب و جمع میتونه نتیجه محاسبات رو عوض کنه، این flag به صورت پیشفرض غیرفعال هست. در کل GCC هشت تا flag برای بهینه سازی عملیات های پایه ریاضی داره که میتونید در پروژه هایی که شامل محاسبات عددی سنگین ولی نه چندان حساس به خطا هستن، استفاده کنید
-ffinite-math-only
-fno-signed-zeros
-fno-trapping-math
-fassociative-math
-fno-math-errno
-freciprocal-math
-funsafe-math-optimizations
-fcx-limited-range
استفاده از flag زیر معادل با فعال کردن همشونه:
-ffast-math
تو این پست میتونید بخونید که هر کدوم از اینا دقیقا چیکار میکنن:
https://kristerw.github.io/2021/10/19/fast-math/
#cpp #gcc
@hpcnerds
kristerw.github.io
Optimizations enabled by -ffast-math
This blog post describes the optimizations enabled by -ffast-math when
compiling C or C++ code with GCC 11 for x86_64 Linux (other languages/operating
systems/CPU architectures may enable slightly different optimizations).
compiling C or C++ code with GCC 11 for x86_64 Linux (other languages/operating
systems/CPU architectures may enable slightly different optimizations).
❤7👍6
قراره یک ورکشاپ یک روزه در مورد کاربرد های Julia در HPC توسط Oak Ridge National Laboratory برگزار بشه که رایگان و مجازی هست. تاریخش هم June 18
https://www.olcf.ornl.gov/calendar/julia-for-hpc-and-intro-to-julia-for-science/
ضمنا این مرکز میزبان قویترین سوپرکامپیوتر فعلی یعنی Frontier هست و توصیه میکنم رویداد هایی که در مورد HPC برگزار میکنه رو از دست ندید :) سه روز بعدش هم یک ورکشاپ دیگه برای کاربرد های Julia در محاسبات علمی برگزار میشه که واسه ثبت نام هر دو میتونید فرم بالا رو ببینید. مهلت ثبت نام هم June 11 هست.
#julia
@hpcnerds
https://www.olcf.ornl.gov/calendar/julia-for-hpc-and-intro-to-julia-for-science/
ضمنا این مرکز میزبان قویترین سوپرکامپیوتر فعلی یعنی Frontier هست و توصیه میکنم رویداد هایی که در مورد HPC برگزار میکنه رو از دست ندید :) سه روز بعدش هم یک ورکشاپ دیگه برای کاربرد های Julia در محاسبات علمی برگزار میشه که واسه ثبت نام هر دو میتونید فرم بالا رو ببینید. مهلت ثبت نام هم June 11 هست.
#julia
@hpcnerds
Oak Ridge Leadership Computing Facility
Julia for HPC and Intro to Julia for Science
The OLCF was established at Oak Ridge National Laboratory in 2004 with the mission of standing up a supercomputer 100 times more powerful than the leading systems of the day.
❤3🔥3🙏2👍1