Không, điều đó không được đảm bảo. Nếu bạn đang sử dụng NETLIB BLAS mà không có bất kỳ tối ưu hóa nào, thì hầu như đúng là các kết quả đều giống nhau. Nhưng đối với bất kỳ việc sử dụng thực tế nào của BLAS và LAPACK, người ta sử dụng BLAS song song được tối ưu hóa cao. Sự song song gây ra, ngay cả khi nó chỉ hoạt động song song bên trong các thanh ghi vectơ của CPU, theo thứ tự các thuật ngữ đơn được đánh giá thay đổi và thứ tự tổng kết cũng thay đổi. Bây giờ nó theo mẫu thuộc tính kết hợp bị thiếu trong tiêu chuẩn IEEE rằng các kết quả không giống nhau. Vì vậy, chính xác những điều bạn đề cập có thể xảy ra.
Trong NETLIB BLAS, sản phẩm vô hướng chỉ là một vòng lặp for không được kiểm soát bởi yếu tố 5:
DO I = MP1,N,5
DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +
$ DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)
END DO
và tùy thuộc vào trình biên dịch nếu mỗi phép nhân được thêm vào DTEMP ngay lập tức hoặc nếu tất cả 5 thành phần được tóm tắt trước và được thêm vào DTEMP. Trong OpenBLAS, tùy thuộc vào kiến trúc, hạt nhân phức tạp hơn:
__asm__ __volatile__
(
"vxorpd %%ymm4, %%ymm4, %%ymm4 \n\t"
"vxorpd %%ymm5, %%ymm5, %%ymm5 \n\t"
"vxorpd %%ymm6, %%ymm6, %%ymm6 \n\t"
"vxorpd %%ymm7, %%ymm7, %%ymm7 \n\t"
".align 16 \n\t"
"1: \n\t"
"vmovups (%2,%0,8), %%ymm12 \n\t" // 2 * x
"vmovups 32(%2,%0,8), %%ymm13 \n\t" // 2 * x
"vmovups 64(%2,%0,8), %%ymm14 \n\t" // 2 * x
"vmovups 96(%2,%0,8), %%ymm15 \n\t" // 2 * x
"vmulpd (%3,%0,8), %%ymm12, %%ymm12 \n\t" // 2 * y
"vmulpd 32(%3,%0,8), %%ymm13, %%ymm13 \n\t" // 2 * y
"vmulpd 64(%3,%0,8), %%ymm14, %%ymm14 \n\t" // 2 * y
"vmulpd 96(%3,%0,8), %%ymm15, %%ymm15 \n\t" // 2 * y
"vaddpd %%ymm4 , %%ymm12, %%ymm4 \n\t" // 2 * y
"vaddpd %%ymm5 , %%ymm13, %%ymm5 \n\t" // 2 * y
"vaddpd %%ymm6 , %%ymm14, %%ymm6 \n\t" // 2 * y
"vaddpd %%ymm7 , %%ymm15, %%ymm7 \n\t" // 2 * y
"addq $16 , %0 \n\t"
"subq $16 , %1 \n\t"
"jnz 1b \n\t"
...
trong đó phân tách sản phẩm vô hướng trong các sản phẩm vô hướng nhỏ có chiều dài 4 và tổng hợp chúng lại.
Sử dụng các triển khai BLAS điển hình khác như ATLAS, MKL, ESSL, ... vấn đề này vẫn giữ nguyên vì mỗi triển khai BLAS sử dụng các tối ưu hóa khác nhau để có được mã nhanh. Nhưng theo tôi biết người ta cần một ví dụ nhân tạo để gây ra kết quả thực sự bị lỗi.
Nếu cần thư viện BLAS trả về cho cùng một kết quả (bit-khôn giống nhau), người ta phải sử dụng thư viện BLAS có thể sao chép, chẳng hạn như: