
زبان برنامهنویسی جولیا اولین زبان سطح بالا بعد از زبانهای C، ++C و Fortran بود که ۸ سال پیش در ۲۰۱۷ با پروژه Celeste به باشگاه پتافلاپ پیوست.
پردازش ۱۷۸ ترابایت داده نجومی در کمتر از ۱۵ دقیقه و شناسایی ۱۸۸ میلیون شیء نجومی و عملکردی بیش از ۱۰۰ برابر بهتر از قبل.
این کار در پروژهای به نام Celeste.jl روی Cori، ابررایانه مرکز محاسبات مرکز پژوهشهای علمی انرژی ملی آمریکا در برکلی کالیفرنیا انجام شد، که با استفاده از ۹۳۰۰ عدد Intel Xeon Phi 7200 با مجموع ۶۵۰ هزار هسته پردازشی، به سرعت پردازش ۱.۵۴ پتافلاپ رسید.
پتافلاپ (Petaflop) واحدی برای سنجش سرعت محاسبات است. ۱ پتافلاپ یعنی ۱ کوادریلیون یا ۱ تریلیارد عملیات محاسباتی در ثانیه. این سرعت فوقالعاده بالا معمولاً فقط در ابررایانهها دیده میشود.
هدف پروژه، جمعآوری تمام دادههای تلسکوپی موجود در جهان و ایجاد یک فهرست واحد از تمام ستارگان و کهکشانها است. به عبارت دیگر، 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 }

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