HPC là công nghệ sử dụng các cụm bộ xử lý mạnh mẽ, hoạt động song song để xử lý các bộ dữ liệu đa chiều khổng lồ (dữ liệu lớn) và giải quyết các vấn đề phức tạp ở tốc độ cực cao. Các hệ thống HPC thường hoạt động ở tốc độ nhanh hơn một triệu lần so với các hệ thống máy tính để bàn, máy tính xách tay hoặc máy chủ nhanh nhất. Trong nhiều thập kỷ, mô hình hệ thống HPC là siêu máy tính, một máy tính được thiết kế có mục đích chứa hàng triệu bộ xử lý hoặc lõi bộ xử lý. Siêu máy tính vẫn ở bên chúng ta; tại thời điểm viết bài này, siêu máy tính nhanh nhất là Frontier có trụ sở tại Hoa Kỳ (liên kết nằm bên ngoài ibm.com), với tốc độ xử lý là 1.102 exaflop , hay triệu tỷ phép tính dấu phẩy động mỗi giây (flops). Nhưng ngày nay, ngày càng có nhiều tổ chức chạy các giải pháp HPC trên các cụm máy chủ tốc độ cao, được lưu trữ tại cơ sở hoặc trên đám mây.
TỔNG QUAN VỀ ĐỀ TÀI
Tổng quan về tính toán hiệu năng cao
Công nghệ HPC (High-Performance Computing) sử dụng các cụm bộ xử lý mạnh mẽ hoạt động song song để xử lý dữ liệu lớn và giải quyết các vấn đề phức tạp với tốc độ cực cao Hệ thống HPC có khả năng hoạt động nhanh gấp hơn một triệu lần so với các máy tính để bàn, laptop hoặc máy chủ nhanh nhất hiện nay.
Trong nhiều thập kỷ, mô hình hệ thống HPC chủ yếu là siêu máy tính, với thiết kế chứa hàng triệu bộ xử lý Siêu máy tính vẫn tồn tại, với Frontier ở Hoa Kỳ hiện là siêu máy tính nhanh nhất, đạt tốc độ 1.102 exaflop Tuy nhiên, ngày nay, nhiều tổ chức đang chuyển sang sử dụng giải pháp HPC trên các cụm máy chủ tốc độ cao, được lưu trữ tại cơ sở hoặc trên đám mây.
1.1.2 HPC hoạt động như thế nào
Một hệ thống máy tính tiêu chuẩn chủ yếu giải quyết vấn đề thông qua tính toán nối tiếp, bằng cách chia khối lượng công việc thành chuỗi các tác vụ và thực hiện chúng lần lượt trên cùng một bộ xử lý.
Ngược lại, HPC tận dụng
Tính toán song song lớn là quá trình thực hiện nhiều tác vụ đồng thời trên nhiều máy chủ hoặc bộ xử lý, cho phép tối ưu hóa hiệu suất Hình thức này sử dụng hàng chục nghìn đến hàng triệu bộ xử lý hoặc lõi bộ xử lý, giúp xử lý khối lượng công việc khổng lồ một cách hiệu quả.
Cụm máy tính (HPC) là hệ thống bao gồm nhiều máy chủ tốc độ cao được kết nối với nhau, với bộ lập lịch tập trung để quản lý khối lượng công việc tính toán song song Các nút trong cụm sử dụng CPU đa lõi hiệu suất cao hoặc GPU, phù hợp cho các phép toán học phức tạp, mô hình học máy và các tác vụ đồ họa chuyên sâu Một cụm HPC có thể có tới 100.000 nút, cho phép xử lý khối lượng lớn dữ liệu một cách hiệu quả.
Các thành phần hiệu suất cao trong cụm HPC bao gồm hệ thống mạng, bộ nhớ, lưu trữ và tệp, tất cả đều được thiết kế với tốc độ cao, thông lượng lớn và độ trễ thấp Điều này giúp các thành phần này hoạt động đồng bộ với các nút trong cụm, tối ưu hóa sức mạnh tính toán và nâng cao hiệu suất tổng thể của hệ thống.
Tổng quan về OpenMP
OpenMP là một giao diện lập trình ứng dụng (API) được sử d ụng để điều khiển các luồng trên cấu trúc chia sẻ b ộ nhớ chung Thành phần của
1 Các chỉ thị biên dịch (Compiler Directives).
2 Các thư viện runtime (Runtime Library Routines).
3 Các biến môi trường (Emviroment Variables).
Các chỉ thị biên dịch, thư viện runtime và biến môi trường được sử dụng để lập trình song song với ngôn ngữ Fortran và C/C++ OpenMP là chuẩn bộ nhớ chia sẻ được hỗ trợ bởi nhiều nền tảng phần cứng và phần mềm như DEC, Intel, IBM, SGI và Numerical Algorithms Group OpenMP có tính khả chuyển cao và có thể hoạt động trên cả môi trường UNIX và Windows NT.
Trước thập kỷ 90, các nhà cung cấp máy tính chia sẻ bộ nhớ đã phát triển sản phẩm hỗ trợ đồng bộ và các chỉ thị cơ bản Ngôn ngữ lập trình Fortran đã được sử dụng rộng rãi để lập trình các chương trình song song trên kiến trúc này, cho phép người dùng giảm thời gian thực hiện bằng cách thực hiện các vòng lặp theo cách song song.
Trong bối cảnh lập trình song song, trình biên dịch tự động hóa việc song song hóa các vòng lặp trên các bộ xử lý SMP, tuy nhiên, mỗi nhà cung cấp áp dụng các phương thức khác nhau tùy thuộc vào nền tảng phần cứng và kiến trúc của họ Để hỗ trợ lập trình song song trên kiến trúc chia sẻ bộ nhớ, chuẩn ANSI X3H5 được ra đời vào năm 1994, nhưng nhanh chóng bị thay thế bởi chuẩn OpenMP vào mùa xuân năm 1997 do sự phổ biến của các máy tính bộ nhớ phân tán Thời điểm này, máy tính chia sẻ bộ nhớ đang rất thịnh hành.
Pthread, mặc dù được sử dụng, nhưng không có tính mở rộng và thiếu các chỉ thị biên dịch, dẫn đến việc hỗ trợ song song không hiệu quả Điều này khiến cho lập trình viên gặp khó khăn trong việc thực hiện song song hóa, vì họ phải chú ý đến nhiều chi tiết ở mức thấp Để khắc phục những nhược điểm này, OpenMP đã được thiết kế nhằm cung cấp giải pháp tốt hơn cho lập trình song song.
1.2.3 M ụ c đ ích và ứ ng d ụ ng c ủ a OpenMP
OpenMP được phát triển nhằm cung cấp một chuẩn chung cho nhiều kiến trúc và nền tảng phần cứng, thiết lập tập hợp các chỉ thị biên dịch hỗ trợ lập trình song song trên máy tính với bộ nhớ chia sẻ Việc thực thi song song chủ yếu thường sử dụng ba đến bốn chỉ thị, giúp đơn giản hóa quá trình lập trình song song và cho phép song hóa chương trình tuần tự mà không cần đến thư viện thông điệp.
OpenMP có thể được áp dụng để giải quyết các vấn đề giới hạn về thời gian, chẳng hạn như dự báo thời tiết, cũng như mô phỏng các tình huống thực tế như
Tổng quan về tính toán song song
➢ Thông thường, phần mềm được viết cho tính toán tuần tự (serial computation):
● Được chạy trên máy tính đơn với một bộ xử lý trung tâm (CPU)
● Một bài toán (problem) sẽ được chia thành một chuỗi các câu lệnh rời rạc
● Các câu lệnh được thực hiện một cách tuần tự
● Tại mỗi thời điểm chỉ thực hiện được một câu lệnh.
➢ Ý nghĩa đơn giản nhất của tính toán song song là việc sử dụng đồng thời nhiều tài nguyên máy tính để giải quyết bài toán về tính toán
● Để chạy trên nhiều CPU
● Một bài toán được chia thành các phần riêng biệt mà có thể được giải quyết đồng thời
● Mỗi phần được chia nhỏ hơn dưới một dãy các câu lệnh
● Các câu lệnh của mỗi phần thực thi đồng thời trên các CPU khác nhau
Tính toán song song là một phương pháp trong lĩnh vực tính toán, cho phép thực hiện nhiều phép tính đồng thời Nguyên tắc cơ bản của nó là chia nhỏ các vấn đề lớn thành những phần nhỏ hơn, từ đó giải quyết chúng một cách hiệu quả và nhanh chóng.
1.3.2 Các nguồn tài nguyên tính toán có thể bao gồm:
● Một máy tính đơn với nhiều bộ vi xử lý (CPU);
● Một máy tính đơn với một hoặc nhiều CPU và một số tài nguyên chuyên dụng như GPU, FPGA …;
● Một số lượng tùy ý các máy tính được kết nối bởi một mạng máy tính;
● Hoặc kết hợp của cả hai loại trên.
1.3.3 Các vấn đề tính toán
Vấn đề tính toán thường được thể hiện qua các đặc điểm như khả năng:
● Chia thành các phần riêng biệt các công việc để có thể giải quyết cùng một lúc;
● Thực thi nhiều câu lệnh chương trình tại nhiều thời điểm;
● Giải quyết bài toán trong thời gian ít hơn với nhiều tài nguyên tính toán hơn là thực thi chỉ trên một tài nguyên tính toán duy nhất
1.3.4 Các mô hình lập trình song song
Mô hình chia sẻ bộ nhớ
Mô hình luồng (Thread)
Mô hình gửi thông điệp (MPI)
Mô hình song song dữ liệu
1.4 Tổng quan về thuật toán Fast Fourier Transform
Phương pháp "Biến Đổi Fourier Nhanh" (Fast Fourier Transform - FFT) là một công cụ toán học quan trọng trong lĩnh vực xử lý tín hiệu và tính toán số học FFT được phát triển nhằm tối ưu hóa quá trình tính toán biến đổi Fourier, giúp giảm độ phức tạp thời gian tính toán từ O(n^2) xuống O(n log n), trong đó n là kích thước của dãy số.
Trong xử lý tín hiệu, FFT (Biến đổi Fourier nhanh) được sử dụng để chuyển đổi tín hiệu từ miền thời gian sang miền tần số, giúp phân tích và xử lý tín hiệu hiệu quả Phương pháp này cũng được áp dụng rộng rãi trong các lĩnh vực như xử lý hình ảnh, truyền thông và nhiều lĩnh vực khác cần phân tích tần số.
Tổng quan về thuật toán Fast Fourier Transform
2.1 Phát biểu đầy đủ bài toán (DIỆU)
2.1.1 Biến đổi Fourier rời rạc
Cho đa thức có bậc n - 1 :
Không mất tính tổng quát, chúng ta giả sử rằng n - số hệ số - là lũy thừa của
2 Nếu n không phải là lũy thừa của 2 , thì chúng ta chỉ cần cộng các số hạng còn thiếu a i x i và đặt các hệ số a i thành 0
Lý thuyết số phức cho thấy rằng phương trình có n nghiệm phức, gọi là căn bậc n, với dạng đặc trưng Những số phức này sở hữu nhiều tính chất thú vị, trong đó gốc n - gốc thứ có thể được sử dụng để mô tả tất cả các gốc thứ n khác.
Biến đổi Fourier rời rạc (DFT) của một đa thức, hay tương đương là vectơ các hệ số, được định nghĩa dựa trên các giá trị của đa thức tại các điểm cụ thể.
Tương tự, phép biến đổi Fourier rời rạc ngược được định nghĩa: DFT nghịch đảo của các giá trị của đa thức là các hệ số của đa thức
GIẢI PHÁP GIẢI QUYẾT BÀI TOÁN
Phát biểu đầy đủ bài toán (DIỆU)
2.1.1 Biến đổi Fourier rời rạc
Cho đa thức có bậc n - 1 :
Không mất tính tổng quát, chúng ta giả sử rằng n - số hệ số - là lũy thừa của
2 Nếu n không phải là lũy thừa của 2 , thì chúng ta chỉ cần cộng các số hạng còn thiếu a i x i và đặt các hệ số a i thành 0
Lý thuyết số phức chỉ ra rằng phương trình bậc n có n nghiệm phức, với các nghiệm có dạng đặc trưng Những số phức này sở hữu nhiều tính chất thú vị, chẳng
Biến đổi Fourier rời rạc (DFT) của một đa thức có thể được hiểu là vectơ các hệ số, trong đó các giá trị của đa thức được xác định tại các điểm cụ thể.
Tương tự, phép biến đổi Fourier rời rạc ngược được định nghĩa: DFT nghịch đảo của các giá trị của đa thức là các hệ số của đa thức
DFT nghịch đảo có khả năng khôi phục các hệ số của đa thức từ các giá trị được tính toán tại các nghiệm thứ n của đa thức thông qua DFT trực tiếp.
2.1.2 Ứng dụng của DFT: nhân nhanh đa thức
Cho hai đa thức A và B, ta thực hiện tính toán DFT cho từng đa thức, cụ thể là DFT(A) và DFT(B) Khi nhân các vectơ DFT(A) và DFT(B) bằng cách nhân từng phần tử tương ứng, kết quả thu được chính là DFT của đa thức DFT(A B).
Cuối cùng, áp dụng DFT nghịch đảo, chúng ta thu được:
Cần lưu ý rằng hai đa thức phải có cùng bậc để thực hiện DFT Tuy nhiên, hai vectơ kết quả của DFT có thể có độ dài khác nhau, và chúng ta có thể điều chỉnh điều này bằng cách thêm các hệ số có giá trị 0.
Khi nhân hai đa thức, kết quả sẽ là một đa thức bậc 2(n−1), do đó cần nhân đôi bậc của mỗi đa thức bằng cách thêm các số 0 Từ một vectơ có n giá trị, việc xây dựng lại đa thức với các hệ số 2^(n−1) là không khả thi.
Biến đổi Fourier nhanh (FFT) là một kỹ thuật hiệu quả để tính toán Biến đổi Fourier rời rạc (DFT) trong thời gian ngắn Phương pháp này dựa trên nguyên tắc chia để trị, trong đó vectơ hệ số của đa thức được chia thành hai vectơ riêng biệt Sau đó, DFT được tính toán đệ quy cho từng vectơ và kết quả được kết hợp để thu được DFT của đa thức đầy đủ.
Vì vậy, giả sử có một đa thức A(x) với bậc n - 1 , trong đó n là lũy thừa của
Chúng ta phân chia đa thức thành hai phần: một phần bao gồm các hệ số ở vị trí chẵn và phần còn lại chứa các hệ số ở vị trí lẻ.
Các đa thức A0 và A1 có hệ số bằng một nửa hệ số của đa thức A Nếu chúng ta có thể tính toán DFT(A) trong thời gian tuyến tính bằng cách sử dụng DFT(A0) và DFT(A1), điều này sẽ tối ưu hóa quá trình tính toán Việc áp dụng phương pháp này không chỉ giúp tiết kiệm thời gian mà còn nâng cao hiệu suất xử lý dữ liệu trong các ứng dụng liên quan đến biến đổi Fourier rời rạc.
DFT ( A 1 ) , thì chúng ta sẽ nhận được phép lặp cho độ phức tạp về thời gian, kết quả là theo master theorem.
Giả sử chúng ta đã tính các vectơ và
Chúng ta hãy tìm một biểu thức cho $ Đối với n 2 giá trị đầu tiên, chúng ta chỉ có thể sử dụng phương trình đã lưu ý trước đó :
Tuy nhiên, đối với n 2 giá trị thứ hai, chúng ta cần tìm một biểu thức khác một chút: Ở đây chúng ta sử dụng lại và hai định danh và
Do đó, ý nhận được các công thức mong muốn để tính toán toàn bộ vectơ ( y k ) :
(Mẫu a+ b và a−b đôi khi được gọi là con bướm (butterfly).)
Cho vectơ - các giá trị của đa thức A bậc n−1 tại các điểm
Chúng ta muốn khôi phục các hệ số của đa thức thông qua phép nội suy, một vấn đề đã biết với các thuật toán chung để giải quyết Tuy nhiên, trong trường hợp đặc biệt này, khi biết giá trị của các điểm tại gốc của sự thống nhất, chúng ta có thể áp dụng một thuật toán đơn giản hơn, tương tự như thuật toán FFT trực tiếp.
Chúng ta có thể viết DFT, theo định nghĩa của nó, ở dạng ma trận:
Ma trận này được gọi là ma trận Vandermonde.
Do đó, chúng ta có thể tính vectơ bằng cách nhân vectơ từ bên trái với nghịch đảo của ma trận:
Kiểm tra nhanh có thể xác minh rằng ma trận nghịch đảo có dạng sau:
Do đó, ta có được công thức:
So sánh điều này với công thức cho y k :
Các vấn đề này có sự tương đồng, vì vậy các hệ số a k có thể được xác định bằng thuật toán chia để trị tương tự như FFT trực tiếp Thay vì sử dụng w n k, chúng ta cần áp dụng w −k n, và cuối cùng, cần chia các hệ số kết quả cho n.
Gỉai pháp đối với bài toán (THẮNG)
2.2.1 Thiết kế thuật toán tuần tự
Một thiết kế thuật toán tuần tự cho thuật toán FFT (Fast Fourier Transform) theo phương pháp Cooley-Tukey.
Thuật toán Cooley_Tukey FFT:
Thuật toán Cooley-Tukey FFT là một phương pháp chia để trị, giúp phân rã đệ quy DFT (Biến đổi Fourier rời rạc) của một số nguyên dương N thành nhiều DFT nhỏ hơn với các kích thước N1 và N2.
1 Đầu vào: x=(x 0 , x 1 , … , x N−1 ), dãy số phức đầu vào có độ dài N, với N là một lũy thừa của 2.
2 Trường hợp cơ bản: Nếu N=1, kết quả trả về x
3 Chia: Chia dãy x thành hai nửa, x even và x odd , mỗi nữa có độ dài N /2
4 Chinh phục: Áp dụng đệ quy FFT cho x even và x odd để thu được X even và
5 Kết hợp: Với k =0, 1, … , N 2 −1 , tính hệ số twiddle W k N và sử dụng nó để kếp hợp kết quả:
6 Đầu ra: Trả về X =( X 0 , X 1 , … , X N −1 ) là kết quả.
Dưới đây là ví dụ:
#include using namespace std; typedef complex Complex; vector fft(const vector &x) { int N = x.size();
// Divide vector x_even, x_odd; for (int i = 0; i < N; i++) { if (i % 2 == 0) { x_even.push_back(x[i]); }else { x_odd.push_back(x[i]); }
// Conquer vector X_even = fft(x_even); vector X_odd = fft(x_odd); // Combine vector X(N); for (int k = 0; k < N/2; k++) {
// Example usage vector input = {1.0, 2.0, 3.0, 4.0}; vector result = fft(input);
// Display the result for (const Complex &value : result) { cout