📙 Parallel and High Performance Computing
✏ Robert Robey & Yuliana Zamora
یکی از جامع ترین منابع برای یادگیری HPC مخصوص برنامه نویس های C++
🔴 Why parallel computing?
🔴 Planning for parallelization
🔴 Performance limits and profiling
🔴 Data design and performance models
🔴 Parallel algorithms and patterns
🔴 Vectorization: FLOPs for free
🔴 OpenMP that performs
🔴 MPI: The parallel backbone
🔴 GPU architectures and concepts
🔴 GPU programming model
🔴 Directive-based GPU programming
🔴 GPU languages: Getting down to basics
🔴 GPU profiling and tools
🔴 Affinity: Truce with the kernel
🔴 Batch schedulers: Bringing order to chaos
🔴 File operations for a parallel world
🔴 Tools and resources for better code
#book #cpp
@hpcnerds
✏ Robert Robey & Yuliana Zamora
یکی از جامع ترین منابع برای یادگیری HPC مخصوص برنامه نویس های C++
🔴 Why parallel computing?
🔴 Planning for parallelization
🔴 Performance limits and profiling
🔴 Data design and performance models
🔴 Parallel algorithms and patterns
🔴 Vectorization: FLOPs for free
🔴 OpenMP that performs
🔴 MPI: The parallel backbone
🔴 GPU architectures and concepts
🔴 GPU programming model
🔴 Directive-based GPU programming
🔴 GPU languages: Getting down to basics
🔴 GPU profiling and tools
🔴 Affinity: Truce with the kernel
🔴 Batch schedulers: Bringing order to chaos
🔴 File operations for a parallel world
🔴 Tools and resources for better code
#book #cpp
@hpcnerds
🔥2👍1
📙 Pro TBB | C++ Parallel Programming with Threading Building Blocks
اینتل این کتاب رو به صورت رایگان منتشر کرده:
https://link.springer.com/book/10.1007/978-1-4842-4398-5
من خودم TBB رو خیلی دوست دارم ولی به جز این دلیل، این کتاب برای افرادی که تجربه قبلی برنامه نویسی موازی ندارند هم مفیده چون اساس این کار و الگو های برنامه نویسی موازی رو هم مورد بحث قرار میده.
#book #cpp #parallelprogramming
@hpcnerds
اینتل این کتاب رو به صورت رایگان منتشر کرده:
https://link.springer.com/book/10.1007/978-1-4842-4398-5
من خودم TBB رو خیلی دوست دارم ولی به جز این دلیل، این کتاب برای افرادی که تجربه قبلی برنامه نویسی موازی ندارند هم مفیده چون اساس این کار و الگو های برنامه نویسی موازی رو هم مورد بحث قرار میده.
#book #cpp #parallelprogramming
@hpcnerds
👍1
📙 High Performance Parallelism Pearls: Multicore and Many-core Programming Approaches
این کتاب واسه شروع برنامه نویسی موازی منبع مناسبی نیست اما اگر تجربه قبلی دارید و دوست دارید بدونید برای افزایش پرفورمنس و بهینه سازی پروژه های واقعی باید چه مسیری رو طی کرد و از چه ایده های میشه استفاده کرد، منبع بی نظیری هست. بعضی از مطالب کتاب مخصوصا برای پردازنده های Xeon Phi نوشته شده که علیرغم ایده جذابی که داشت، تولیدش توسط اینتل ادامه پیدا نکرد. ولی باقی مطالبش برای برنامه نویسی موازی و توزیع شده به صورت کلی هم قابل استفاده است.
#book #cpp
@hpcnerds
این کتاب واسه شروع برنامه نویسی موازی منبع مناسبی نیست اما اگر تجربه قبلی دارید و دوست دارید بدونید برای افزایش پرفورمنس و بهینه سازی پروژه های واقعی باید چه مسیری رو طی کرد و از چه ایده های میشه استفاده کرد، منبع بی نظیری هست. بعضی از مطالب کتاب مخصوصا برای پردازنده های Xeon Phi نوشته شده که علیرغم ایده جذابی که داشت، تولیدش توسط اینتل ادامه پیدا نکرد. ولی باقی مطالبش برای برنامه نویسی موازی و توزیع شده به صورت کلی هم قابل استفاده است.
#book #cpp
@hpcnerds
📙 Programming in Parallel with CUDA: A Practical Guide
تمرکز این کتاب بیشتر روی محاسبات علمی هست و مثال ها تمرین هاش بر همین اساس طراحی شده. در مقایسه با باقی کتاب های موجود در مورد CUDA استفاده مناسب تری از امکانات مدرن C++ و امکاناتی که در نسخه های اخیر CUDA اضافه شدن داره.
#book #cuda #cpp
@hpcnerds
تمرکز این کتاب بیشتر روی محاسبات علمی هست و مثال ها تمرین هاش بر همین اساس طراحی شده. در مقایسه با باقی کتاب های موجود در مورد CUDA استفاده مناسب تری از امکانات مدرن C++ و امکاناتی که در نسخه های اخیر CUDA اضافه شدن داره.
#book #cuda #cpp
@hpcnerds
تصور کنید میتونید کد برنامتون رو به سه قسمت A و B و C تقسیم کنید به صورتی که قسمت های A و B میتونن به صورت موازی اجرا بشن اما برای اجرای قسمت C به نتیجه A و B احتیاج داریم. یکی از ابزار های شناخته شده برنامه نویسی موازی که برای برخورد با همچین سناریو هایی توسعه پیدا کردن Flow Graph ها هستن. به صورت کلی روش استفاده اینطوری هست که وابستگی بین قسمت های برنامه رو به عنوان یک گراف وابستگی مشخص میکنیم و اون ابزار منابع محاسباتی مثل thread ها یا هسته ها رو به شکل بهینه برای اجرای کد زمانبندی میکنه.اگه از C++ استفاده میکنید کتابخانه TBB امکانات خوبی برای طراحی و اجرای Flow Graph ها داره. یکی دیگه از پروژه هایی که به صورت مستقل و اختصاصی برای این مسئله طراحی شده TaskFlow هست:
🟢 A General-purpose Parallel and Heterogeneous Task Programming System
📙 https://taskflow.github.io/
اما اگه از جولیا استفاده میکنید، میتونید نگاهی به Dagger بندازید:
🟢 A framework for out-of-core and parallel execution
📙 https://juliaparallel.org/Dagger.jl/dev
#tools #julia #cpp
@hpcnerds
🟢 A General-purpose Parallel and Heterogeneous Task Programming System
📙 https://taskflow.github.io/
اما اگه از جولیا استفاده میکنید، میتونید نگاهی به Dagger بندازید:
🟢 A framework for out-of-core and parallel execution
📙 https://juliaparallel.org/Dagger.jl/dev
#tools #julia #cpp
@hpcnerds
👍6
چطور کتابخانه های 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 گفتم یکی از تکنیک هایی که پیاده سازی های سریع ازش استفاده قابل توجهی کردن 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