Chúng tôi viết mã để kiểm tra hiệu suất của một số ngôn ngữ máy tính [Python, Julia, Matlab, IDL, R, Java, Scala, Fortran và C]. Các mã giải quyết các tác vụ đơn giản để kiểm tra cách các ngôn ngữ khác nhau xử lý các vòng lặp, vector hóa, đa xử lý, thao tác mảng, đọc các tập hợp tệp, v.v. Mục tiêu không phải là xác định ngôn ngữ nào tốt hơn ngôn ngữ kia mà thay vào đó là làm nổi bật điểm mạnh và điểm yếu của từng ngôn ngữ. Chúng tôi cũng muốn nhấn mạnh tầm quan trọng của việc có các ngôn ngữ có thể tương tác với nhau để giải quyết các ứng dụng phức tạp. Các kết quả [được cập nhật ít nhất mỗi năm một lần] từ nghiên cứu này được trình bày [bao gồm cả mã nguồn] thông qua một trang web của NASA mà các học viên cần thông tin đó có thể truy cập được để xác định ngôn ngữ nào phù hợp để hoàn thành một nhiệm vụ cụ thể
Tải ngay
Chi tiết phần mềm
Loại
Công cụ thiết kế và tích hợp
Số tham chiếu
GSC-18111-1
Loại phát hành
Mã nguồn mở
Hệ điều hành
Linux, hệ điều hành X
Liên hệ với chúng tôi về công nghệ này
Trung tâm bay không gian Goddard
gsfc-softwarerequest@mail. nasa. chính phủ
Chỉnh sửa ngày 6 tháng 2 năm 2018. Một số lưu ý. Trong Python
import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
2 nhanh hơn import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
3 nhanh hơn import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
0. Tuy nhiên, trong MATLAB trên máy của tôi, import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
0 nhanh hơn một chút so với import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
3. Mã Fortran tôi chạy có thể được cải thiện một chút [ python numpy_bench.py
> python numba_bench_single.py
> python numba_bench_par.py
Thư mục MATLAB và thực thi
import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
0Thư mục Fortran và thực thi
import numpy as np
import numba
import time as time
@numba.vectorize[["float64[float64,float64]"],
nopython=True,target='cpu']
def add2_par[x, y]:
return x + 2 * y
n = np.array[ int[1e9]]# number of data points
X = np.ones[n, dtype=np.float]
Y = np.ones[n, dtype=np.float]
t0 = time.time[]
add2_par[X, Y, out=X]
t1 = time.time[]
run_time = t1 - t0
1Kết quả
Trên cả hai máy của tôi, một lần chạy Numba luồng đơn trung bình nhanh hơn mã Fortran đã biên dịch [không có mức tối ưu hóa -O2]. Với mức tối ưu hóa -O2, có vẻ như Fortran nhanh hơn luồng đơn lẻ, nhưng với biên độ rất hẹp. Bên dưới, bạn sẽ thấy thời gian chạy trung bình tính bằng giây giữa gfortran -O2 và Python Numba luồng đơn
Phần tử mảng CPUgfortran -O2 [s]Python Numba [s]AMD FX-83701,000,0000. 002250. 00202AMD FX-837010,000,0000. 019520. 01946AMD FX-8370100,000,0000. 192580. 18895AMD FX-83701,000,000,0001. 907811. 91261i5-6300u1,000,0000. 001280. 00098i5-6300u10,000,0000. 009960. 01041i5-6300u100,000,0000. 100230. 10142i5-6300u1,000,000,0000. 949561. 03110Tôi không mong đợi điều này – và tôi không chắc thứ ma thuật đen gọi là Numba này hoạt động như thế nào… Tôi cần nghiên cứu thêm về những gì Numba thực sự đang làm với phần tổng hợp JIT. Xếp hạng tốc độ từ Chậm nhất đến Nhanh nhất trên AMD-FX870. MATLAB, NumPy, gfortran, Numba luồng đơn, gfortran -O2, Numba song song. Với i5-6300U, thời gian MATLAB và NumPy ít khác biệt hơn [về cơ bản chúng giống nhau]
Tôi cũng rất ngạc nhiên khi thấy với i5-6300u, NumPy và Fortran chạy với tốc độ gần như nhau. Đối với mảng 1.000.000.000 phần tử, mã Fortran [không có cờ O2] chỉ là 3. Nhanh hơn 7% so với mã NumPy
Mã Numba song song thực sự tỏa sáng với 8 lõi của AMD-FX870, nhanh hơn khoảng 4 lần so với MATLAB và nhanh hơn 3 lần so với Numpy. Tuy nhiên, mã Numba song song chỉ nhanh hơn khoảng hai lần so với Numpy với i5-6300u, nhưng điều này hợp lý vì đây chỉ là bộ xử lý hai lõi [4 luồng]
Các số liệu bên dưới hiển thị kết quả điểm chuẩn của thời gian chạy trung bình trên thang đo log-log. Một con số khác cho thấy việc triển khai chậm hơn bao nhiêu so với mức trung bình chạy song song của Numba
Thảo luận về việc sử dụng bộ nhớ
Bạn không thể thực hiện điểm chuẩn này mà không đề cập rằng ví dụ Python này là Bộ nhớ HOG khi so sánh với Fortran và MATLAB. Python sẽ đạt mức cao nhất là 24 GB RAM để thực hiện phép toán với 1.000.000.000 mảng phần tử, bất kể bạn sử dụng Numba hay NumPy thuần túy. Điều này cực kỳ kém hiệu quả – vì Python chỉ lưu trữ 16 GB dữ liệu trong RAM sau và trước khi hoạt động. MATLAB và Fortran giải quyết vấn đề này với mức sử dụng bộ nhớ cao nhất là 16 GB RAM. Cần thêm 33% RAM để thực hiện thao tác mảng với Python so với MATLAB hoặc Fortran. [Mức sử dụng RAM cao nhất được ước tính bằng thời gian GNU /usr/bin/time -v]
Phần kết luận
Wow Numba thật nhanh. Tôi chưa bao giờ mong đợi được thấy sự kết hợp mảng Python NumPy Numba nhanh như mã Fortran được biên dịch. Chi phí rõ ràng là cần có thời gian để chuyển mã Python NumPy hiện có của bạn sang Numba. Khả năng tăng tốc song song của Numba hoạt động rất tốt trong vấn đề này và với 8 nhân AMD-FX870 song song Numba chạy nhanh hơn 4 lần so với mã MATLAB
Có bất cứ điều gì tôi bỏ lỡ? . Bạn có thể xem mã tôi đã sử dụng để chạy điểm chuẩn tại đây
Điều đáng lưu ý là tôi đã không thực hiện điểm chuẩn này với ATLAS và việc sử dụng ATLAS có thể tăng tốc nghiêm trọng quá trình thực thi Fortran của vấn đề này [và cũng có khả năng tăng tốc quá trình thực thi Numpy và Numba]