این کانال برای علاقمندان به High Performance Computing و محاسبات علمی ایجاد شده و محتوای آن شامل کتاب، دوره، نکات کدنویسی و منابع مفید در مورد مباحث زیر هست:
🔴 High Performance Computing
🔴 Parallel Programming
🔴 Distributed Programming
🔴 GPU Programming
🔴 Scientific Computing
🔴 Numerical Methods
🔴 Simulation
🟢 C/C++ Programming
🟢 Julia Programming
@hpcnerds
🔴 High Performance Computing
🔴 Parallel Programming
🔴 Distributed Programming
🔴 GPU Programming
🔴 Scientific Computing
🔴 Numerical Methods
🔴 Simulation
🟢 C/C++ Programming
🟢 Julia Programming
@hpcnerds
❤4👍3
📙 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
📙 Numerical Methods for Scientific Computing
✏ Kyle Novak
🔴 Direct Methods for Linear Systems
🔴 Inconsistent Systems
🔴 Computing Eigenvalues
🔴 Iterative Methods for Linear Systems
🔴 The Fast Fourier Transform
🔴 Solutions to Nonlinear Equations
🔴 Interpolation
🔴 Approximating Functions
🔴 Differentiation and Integration
🔴 Ordinary Differential Equations
🔴 Parabolic Equations
🔴 Hyperbolic Equations
🔴 Elliptic Equations
🔴 Fourier Spectral Methods
نویسنده نسخه pdf این کتاب رو هم به صورت رایگان به اشتراک گذاشته:
https://www.equalsharepress.com
کتاب شامل پیاده سازی خیلی از روش ها در جولیا هم هست.
#book #julia #scientificcomputing
@hpcnerds
✏ Kyle Novak
🔴 Direct Methods for Linear Systems
🔴 Inconsistent Systems
🔴 Computing Eigenvalues
🔴 Iterative Methods for Linear Systems
🔴 The Fast Fourier Transform
🔴 Solutions to Nonlinear Equations
🔴 Interpolation
🔴 Approximating Functions
🔴 Differentiation and Integration
🔴 Ordinary Differential Equations
🔴 Parabolic Equations
🔴 Hyperbolic Equations
🔴 Elliptic Equations
🔴 Fourier Spectral Methods
نویسنده نسخه pdf این کتاب رو هم به صورت رایگان به اشتراک گذاشته:
https://www.equalsharepress.com
کتاب شامل پیاده سازی خیلی از روش ها در جولیا هم هست.
#book #julia #scientificcomputing
@hpcnerds
👎1🔥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
📙 Parallel Computing and Scientific Machine Learning
Dr. Chris Rackauckas, MIT
لیست ویدئو های دوره
https://www.youtube.com/playlist?list=PLCAl7tjCwWyGjdzOOnlbGnVNZk0kB8VSa
مطالب دوره در قالب یک کتاب آنلاین
https://book.sciml.ai/
مباحث:
🔴 Optimizing Serial Code
🔴 Physics-Informed Neural Networks
🔴 Introduction to Discrete Dynamical Systems
🔴 The Basics of Single Node Parallel Computing
🔴 Styles of Parallelism
🔴 Ordinary Differential Equations
🔴 Forward-Mode Automatic Differentiation
🔴 Solving Stiff Ordinary Differential Equations
🔴 Basic Parameter Estimation, Reverse-Mode AD, and Inverse Problems
🔴 Differentiable Programming and Neural Differential Equations
🔴 MPI for Distributed Computing
🔴 Mathematics of ML and HPC
🔴 GPU Computing
🔴 Partial Differential Equations and Convolutional Neural Networks
🔴 Probabilistic Programming
🔴 Global Sensitivity Analysis
🔴 Code Profiling and Optimization
🔴 Uncertainty Programming and Generalized Uncertainty Quantification
#course
@hpcnerds
Dr. Chris Rackauckas, MIT
لیست ویدئو های دوره
https://www.youtube.com/playlist?list=PLCAl7tjCwWyGjdzOOnlbGnVNZk0kB8VSa
مطالب دوره در قالب یک کتاب آنلاین
https://book.sciml.ai/
مباحث:
🔴 Optimizing Serial Code
🔴 Physics-Informed Neural Networks
🔴 Introduction to Discrete Dynamical Systems
🔴 The Basics of Single Node Parallel Computing
🔴 Styles of Parallelism
🔴 Ordinary Differential Equations
🔴 Forward-Mode Automatic Differentiation
🔴 Solving Stiff Ordinary Differential Equations
🔴 Basic Parameter Estimation, Reverse-Mode AD, and Inverse Problems
🔴 Differentiable Programming and Neural Differential Equations
🔴 MPI for Distributed Computing
🔴 Mathematics of ML and HPC
🔴 GPU Computing
🔴 Partial Differential Equations and Convolutional Neural Networks
🔴 Probabilistic Programming
🔴 Global Sensitivity Analysis
🔴 Code Profiling and Optimization
🔴 Uncertainty Programming and Generalized Uncertainty Quantification
#course
@hpcnerds
👍1
HPC Nerds | High Performance and Scientific Computing
📙 Parallel Computing and Scientific Machine Learning Dr. Chris Rackauckas, MIT لیست ویدئو های دوره https://www.youtube.com/playlist?list=PLCAl7tjCwWyGjdzOOnlbGnVNZk0kB8VSa مطالب دوره در قالب یک کتاب آنلاین https://book.sciml.ai/ مباحث: 🔴 Optimizing Serial…
زبان جولیا سن کمتری نسبت به باقی زبان های محاسبات علمی داره اما در همین مدت کوتاه به خاطر استقبال جامعه آکادمیک، اکوسیستم بی نظیری از پکیج های محاسبات علمی واسش توسعه داده شده. یکی از فعال ترین افراد در توسعه این اکوسیستم Chris Rackauckas هست. توصیه میکنم این دوره ای که در MIT ارائه داده رو از دست ندید.
📙 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
Singularity for HPC
هیچکدوم از ما دوست نداره وقتی یه سرور محاسبات سنگین اجاره کردیم زمان قابل توجهی رو برای راه اندازی سرور و نیازمندی های برنامه ای که قراره اجرا بشه هدر بدیم.
طبیعتاً در پروژه های HPC هم مشابه پروژه های عادی، میتونیم به استفاده از container ها فکر کنیم. معروف ترین container platform در دنیای مهندسی نرم افزار Docker هست اما پروژه های HPC به علت ماهیت داینامیک منابع محاسباتی در دسترس نیازهای متفاوتی در این زمینه دارند.
یکی از container platform هایی که مخصوص کلاستر های محاسبات سنگین طراحی شده Singularity هست و میتونید ازش روی کلاستر هایی که منابعشون توسط Slurm مدیریت میشه هم استفاده کنید.
مستندات پروژه:
📙 SingularityCE User Guide
https://docs.sylabs.io/guides/4.1/user-guide/
@hpcnerds
هیچکدوم از ما دوست نداره وقتی یه سرور محاسبات سنگین اجاره کردیم زمان قابل توجهی رو برای راه اندازی سرور و نیازمندی های برنامه ای که قراره اجرا بشه هدر بدیم.
طبیعتاً در پروژه های HPC هم مشابه پروژه های عادی، میتونیم به استفاده از container ها فکر کنیم. معروف ترین container platform در دنیای مهندسی نرم افزار Docker هست اما پروژه های HPC به علت ماهیت داینامیک منابع محاسباتی در دسترس نیازهای متفاوتی در این زمینه دارند.
یکی از container platform هایی که مخصوص کلاستر های محاسبات سنگین طراحی شده Singularity هست و میتونید ازش روی کلاستر هایی که منابعشون توسط Slurm مدیریت میشه هم استفاده کنید.
مستندات پروژه:
📙 SingularityCE User Guide
https://docs.sylabs.io/guides/4.1/user-guide/
@hpcnerds
👍4
📔 Introduction to HPC with MPI for Data Science
✏️ Frank Nielsen
یه منبع عالی برای یادگیری MPI با C++ مخصوص کاربرد های machine learning
در بخش اول به آموزش کلی MPI پرداخته و بعد سناریو های معروف مثل محاسبات ماتریسی توزیع شده رو بحث میکنه و در بخش دوم کتاب پیاده سازی توزیع شده الگوریتم های پراستفاده در machine learning رو بررسی کرده.
#book #mpi
@hpcnerds
✏️ Frank Nielsen
یه منبع عالی برای یادگیری MPI با C++ مخصوص کاربرد های machine learning
در بخش اول به آموزش کلی MPI پرداخته و بعد سناریو های معروف مثل محاسبات ماتریسی توزیع شده رو بحث میکنه و در بخش دوم کتاب پیاده سازی توزیع شده الگوریتم های پراستفاده در machine learning رو بررسی کرده.
#book #mpi
@hpcnerds
👎1
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
https://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
https://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