HPC Nerds | High Performance and Scientific Computing
266 subscribers
17 photos
20 links
High performance and scientific computing

🔴 High Performance Computing
🔴 Parallel Programming
🔴 Distributed Programming
🔴 GPU Programming
🔴 Scientific Computing
🔴 Simulation



admin: @amirabbasasadi
Download Telegram
📙 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
🔥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
👍1
📙 High Performance Parallelism Pearls: Multicore and Many-core Programming Approaches

این کتاب واسه شروع برنامه نویسی موازی منبع مناسبی نیست اما اگر تجربه قبلی دارید و دوست دارید بدونید برای افزایش پرفورمنس و بهینه سازی پروژه های واقعی باید چه مسیری رو طی کرد و از چه ایده های میشه استفاده کرد، منبع بی نظیری هست. بعضی از مطالب کتاب مخصوصا برای پردازنده های Xeon Phi نوشته شده که علیرغم ایده جذابی که داشت، تولیدش توسط اینتل ادامه پیدا نکرد. ولی باقی مطالبش برای برنامه نویسی موازی و توزیع شده به صورت کلی هم قابل استفاده است.

#book #cpp

@hpcnerds
📙 Programming Massively Parallel Processors: A Hands-on Approach

یکی از بهترین کتاب ها برای یاد گرفتن برنامه نویسی CUDA با C++


#book #cuda #cpp
@hpcnerds
📙 Programming in Parallel with CUDA: A Practical Guide

تمرکز این کتاب بیشتر روی محاسبات علمی هست و مثال ها تمرین هاش بر همین اساس طراحی شده. در مقایسه با باقی کتاب های موجود در مورد 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
👍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
7👍2🙏1
قبلا در مورد BLAS گفتم یکی از تکنیک هایی که پیاده سازی های سریع ازش استفاده قابل توجهی کردن SIMD هست و کلا در این مدل محاسبات خیلی موثر و پراستفاده است. حقیقت اینه که به علت وابستگی زیاد به سخت افزار انجام دادنش به صورت portable میتونه پر دردسرتر از موازی سازی در سطوح بالاتر باشه به همین خاطر منابع آموزشی زیادی برای یادگرفتنش نیست. به هر حال اگر دوست دارید شیوه انجامش در C++ رو یاد بگیرید، میتونید این آموزش از Sergey Slotin رو ببینید:
https://youtu.be/vIRjSdTCIEU?si=a2oT-lYFxWPGIkOQ

#cpp #cplusplus #SIMD
@hpcnerds
3👍2
این تیکه کد رو ببینید، وقتی اجرا بشه 7 تا عمل ضرب انجام میده:
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
7👍6