Trong lĩnh vực tính toán số học, việc đảm bảo độ chính xác và độ tin cậy của các thư viện toán học đặt ra những thách thức độc đáo vượt xa các phương pháp kiểm thử phần mềm truyền thống. Các cuộc thảo luận gần đây giữa các chuyên gia trong ngành đã làm nổi bật những hiểu biết quan trọng về việc kiểm thử các chương trình số học, đặc biệt là trong môi trường tính toán hiệu năng cao và các thư viện toán học chuyên biệt.
Thách thức về Độ chính xác Dấu phẩy động
Một trong những thách thức lớn nhất trong kiểm thử số học là xử lý độ chính xác dấu phẩy động. Các chuyên gia trong ngành đã chỉ ra rằng việc chỉ sử dụng các giá trị dung sai cố định như 1e-6 có thể gây ra vấn đề. Như được nhấn mạnh trong các cuộc thảo luận cộng đồng, sai số tương đối thay vì sai số tuyệt đối nên là phương pháp tiêu chuẩn cho phép tính dấu phẩy động, mặc dù phương pháp này cũng có những hạn chế riêng.
Tuy nhiên, sai số tương đối cũng không phải là giải pháp hoàn hảo. Nếu tôi tính 1 + 1e9, thì việc cho ra kết quả 1e9 - 1 sẽ dễ dàng nằm trong giới hạn sai số tương đối 1e-6. Nói chung, sai số tương đối chỉ hoạt động hiệu quả nếu phép tính của bạn tỷ lệ nhân từ số không.
Các Vấn đề Bất ngờ từ Thư viện của Nhà cung cấp
Một phát hiện đáng chú ý từ cộng đồng là việc tìm thấy nhiều lỗi trong các thư viện toán học do nhà cung cấp cung cấp. Các kỹ sư làm việc với Kokkos Kernels đã phát hiện các vấn đề trong các thư viện lớn bao gồm OpenBLAS, MKL, cuSparse, và rocSparse. Điều này nhấn mạnh tầm quan trọng của việc kiểm thử kỹ lưỡng ngay cả khi sử dụng các giải pháp từ nhà cung cấp uy tín.
Trường hợp Biên và Ma trận Đơn giản
Kiểm thử với các trường hợp biên đã được chứng minh là một trong những chiến lược hiệu quả nhất. Các chuyên gia khuyến nghị kiểm thử với các ma trận có kích thước {0,1,2,3,4} và các giá trị đặc biệt như NaN, +0, -0, +1, -1, +Inf, -Inf. Những trường hợp đơn giản này thường phát hiện ra các vấn đề quan trọng mà các trường hợp kiểm thử phức tạp có thể bỏ sót.
Các Phương Pháp Kiểm Thử Chính cho Thư Viện Số:
- Kiểm thử trường hợp biên với ma trận có kích thước {0,1,2,3,4}
- Kiểm thử giá trị đặc biệt: NaN, +0, -0, +1, -1, +Inf, -Inf
- Kiểm thử dựa trên thuộc tính với dữ liệu đầu vào ngẫu nhiên
- Kiểm thử hàm nghịch đảo (xác minh hai chiều)
- Kiểm thử đối chiếu với các giải pháp phân tích đã biết
Mối quan ngại về Tương thích Phiên bản
Một vấn đề quan trọng được cộng đồng nêu ra liên quan đến tính tương thích giữa các phiên bản trong thư viện số học. Nhiều thư viện số học Python thay đổi cách biểu diễn nội bộ và thuật toán giữa các phiên bản, có thể tạo ra các kết quả hơi khác nhau. Điều này có thể có những tác động nghiêm trọng đối với các ngành như tài chính, nơi khả năng tái tạo kết quả là yếu tố then chốt.
Các Cân nhắc ở Cấp độ Phần cứng
Cộng đồng đã chỉ ra rằng ngay cả ở cấp độ phần cứng, các phép tính dấu phẩy động có thể khác nhau. Các bộ xử lý x64 hiện đại có thể thực hiện các phép tính dấu phẩy động bằng cách sử dụng thanh ghi SSE (64-bit IEEE) hoặc lệnh x87 (độ chính xác mở rộng 80-bit), có thể dẫn đến các kết quả khác nhau tùy thuộc vào cài đặt trình biên dịch và khả năng phần cứng.
Tóm lại, việc kiểm thử các chương trình số học đòi hỏi một phương pháp tiếp cận đa chiều kết hợp kiểm thử đơn vị truyền thống với các kỹ thuật chuyên biệt để xử lý số học dấu phẩy động. Kinh nghiệm của cộng đồng cho thấy một chiến lược kiểm thử toàn diện nên bao gồm các trường hợp biên, kiểm thử dựa trên thuộc tính, và cân nhắc cẩn thận các vấn đề về tương thích phần cứng và phiên bản.
Nguồn tham khảo: Unit Testing Numerical Routines