ویرگول
ورودثبت نام
عباس پالاش
عباس پالاشداد جاروبی به دستم آن نگار / گفت کز دریا برانگیزان غبار
عباس پالاش
عباس پالاش
خواندن ۲ دقیقه·۲ ماه پیش

چرا زبان جولیا سریع است

تلسکوپ ویکتور ام. بلانکو در رصدخانه Cerro Tololo در شیلی
تلسکوپ ویکتور ام. بلانکو در رصدخانه Cerro Tololo در شیلی

جولیا تنها عضو سطح بالای باشگاه پتافلاپ

زبان برنامه‌نویسی جولیا اولین زبان سطح بالا بعد از زبان‌های C، ++C و Fortran بود که ۸ سال پیش در ۲۰۱۷ با پروژه Celeste به باشگاه پتافلاپ پیوست.

پردازش ۱۷۸ ترابایت داده نجومی در کمتر از ۱۵ دقیقه و شناسایی ۱۸۸ میلیون شیء نجومی و عملکردی بیش از ۱۰۰ برابر بهتر از قبل.

این کار در پروژه‌ای به نام Celeste.jl روی Cori، ابررایانه مرکز محاسبات مرکز پژوهش‌های علمی انرژی ملی آمریکا در برکلی کالیفرنیا انجام شد، که با استفاده از ۹۳۰۰ عدد Intel Xeon Phi 7200 با مجموع ۶۵۰ هزار هسته پردازشی، به سرعت پردازش ۱.۵۴ پتافلاپ رسید.

پتافلاپ چیست؟

پتافلاپ (Petaflop) واحدی برای سنجش سرعت محاسبات است. ۱ پتافلاپ یعنی ۱ کوادریلیون یا ۱ تریلیارد عملیات محاسباتی در ثانیه. این سرعت فوق‌العاده بالا معمولاً فقط در ابررایانه‌ها دیده می‌شود.

پروژه Celeste

هدف پروژه، جمع‌آوری تمام داده‌های تلسکوپی موجود در جهان و ایجاد یک فهرست واحد از تمام ستارگان و کهکشان‌ها است. به عبارت دیگر، Celeste می‌خواهد یک کاتالوگ کامل نجومی بسازد که شامل موقعیت، روشنایی و ویژگی‌های هر جرم آسمانی باشد.

روش کار: استفاده از مدل‌های آماری پیچیده برای تخمین موقعیت، روشنایی، و مشخصات هر جرم آسمانی.

زبان مورد استفاده: Julia، به دلیل سرعت بالا و قابلیت‌های محاسبات موازی. پردازش داده‌ها به صورت موازی و توزیع‌شده روی ابرکامپیوترها.

سطح عملکرد: روی ابرکامپیوتر Cori در NERSC، پروژه توانست با بهره‌ گرفتن از حدود 1.3 میلیون نخ پردازشی به 1.54 پتافلاپ برسد.

ویژگی‌های زبان جولیا

جولیا برای محاسبات عددی و علمی طراحی شده و سرعت بسیار نزدیک به C و ++C دارد.

Just-In-Time (JIT) compilation با LLVM → کد ماشین بهینه.

به راحتی با GPU و MPI کار می‌کند و مناسب برای محاسبات موازی و توزیع‌شده است.

بررسی ساده

زبان جولیا با وجود اسکریپتی بودن، در لحظه (Just In Time, JIT) به کد LLVM یا Low Level Virtual Machine تبدیل می‌شود. به بهینه‌سازی واقعی در مثال زیر توجه کنید.

فرض کنید ۲ تابع زیر را نوشته‌ایم

foo(x)=x+3 bar(x)=foo(x*2)

و حالا می‌خواهیم bar(3) را حساب کنیم که مقدار آن ۹ است.
بطور طبیعی انتظار داریم که این‌گونه محاسبه شود و تابع bar تابع foo را صدا بزند.

bar(3) -> foo(3*2) -> 3*2+3 -> 9

حالا از جولیا می‌خواهیم تا کد کامپایل شده را نشان دهد.

@code_llvm debuginfo=:none bar(3) ; Function Signature: bar(Int64) ; Function Attrs: uwtable define i64 @julia_bar_782(i64 signext %"x::Int64") #0 { top: %0 = shl i64 %"x::Int64", 1 %1 = add i64 %0, 3 ret i64 %1 }
خروجی LLVM کد جولیا
خروجی LLVM کد جولیا

محاسبه به این صورت انجام شده است. ابتدا پارامتر ورودی یا همان x به چپ شیفت داده شده است. شیفت یا انتقال ارقام در هر مبنایی معادل ضرب در آن مبناست. مثلا اگر 17 در مبنای 10 به چپ شیفت داده شود 170 می‌شود. در مبنای ۲ این کار معادل ضرب در ۲ است. سپس حاصل با ۳ جمع شده و نتیجه برگردانده شده است.

خبری از فراخوانی تابع foo نیست و عملا در کد نهایی حذف شده که باعث می‌شود عملیات پرهزینه فراخوانی حذف شود و در عمل ۲ بهینه‌سازی انجام شده است.

منابع

پروژه Celeste

بررسی جولیا در پروژه Celeste

جولیاjulia
۲
۰
عباس پالاش
عباس پالاش
داد جاروبی به دستم آن نگار / گفت کز دریا برانگیزان غبار
شاید از این پست‌ها خوشتان بیاید