2010-08-28 26 views
13

fma(a,b,c) tương đương với a*b+c ngoại trừ nó không làm tròn kết quả trung gian.Thuật toán nào được hưởng lợi nhiều nhất từ ​​việc nhân lên hợp nhất?

Bạn có thể cho tôi một số ví dụ về các thuật toán không có lợi cho việc tránh làm tròn này không?

Nó không rõ ràng, như làm tròn sau khi phép nhân mà chúng ta tránh có xu hướng ít vấn đề hơn làm tròn sau khi bổ sung mà chúng ta không.

Trả lời

5

taw nhấn vào một ví dụ quan trọng; nói chung, FMA cho phép các nhà văn thư viện thực hiện hiệu quả nhiều hoạt động điểm nổi khác với làm tròn chính xác.Ví dụ, một nền tảng có FMA có thể sử dụng nó để thực hiện phân chia tròn và căn bậc hai một cách chính xác (PPC và Itanium đã thực hiện phương pháp này), cho phép FPU về cơ bản là một máy FMA mục đích duy nhất. Peter Tang và John Harrison (Intel), và Peter Markstein (HP) có một số giấy tờ giải thích việc sử dụng này nếu bạn tò mò.

Ví dụ taw mang lại hữu ích hơn rất nhiều so với chỉ trong giới hạn lỗi theo dõi. Nó cho phép bạn đại diện cho sản phẩm của hai số dấu phẩy động như một tổng của hai số dấu chấm động mà không có bất kỳ lỗi làm tròn nào; điều này khá hữu ích trong việc triển khai các hàm thư viện dấu phẩy động được làm tròn chính xác. Sách của Jean-Michel Muller hoặc các giấy tờ trên crlibm sẽ là những nơi bắt đầu tốt để tìm hiểu thêm về những cách sử dụng này.

FMA cũng rất hữu ích trong việc giảm đối số trong các thường trình kiểu toán học-thư viện đối với một số loại đối số nhất định; khi một người đang làm giảm đối số, mục tiêu của việc tính toán thường là một từ có dạng (x - a*b), trong đó (a*b) gần như bằng x; đặc biệt, kết quả thường là theo thứ tự của lỗi làm tròn trong cụm từ (a*b), nếu điều này được tính mà không có FMA. Tôi tin rằng Muller cũng đã viết một số về điều này trong cuốn sách của ông.

1

Off đỉnh đầu của tôi - nhân Matrix, quy tắc của Newton, đánh giá đa thức, phương pháp số

2

Lợi ích chính của FMA là nó có thể nhanh gấp hai lần. Thay vì dùng 1 chu trình cho phép nhân và sau đó 1 chu kỳ cho phép cộng, FPU có thể phát hành cả hai thao tác trong cùng một chu kỳ. Rõ ràng, hầu hết các thuật toán sẽ được hưởng lợi từ các hoạt động nhanh hơn.

+2

Câu hỏi là về tác động của làm tròn, không về việc này. Câu trả lời của bạn cũng không chính xác vì fma yêu cầu 3 đơn vị dấu chấm động đầu vào thay vì đầu vào tiêu chuẩn 2, cổng phụ trong tệp đăng ký dấu phẩy động, và trình bổ sung điểm nổi rộng hơn Đây không phải là miễn phí, đó là sự hỗ trợ của fma với chi phí của một số phần cứng khác. – taw

+0

taw: Bạn đã hỏi những thuật toán nào được hưởng lợi từ FMA và đối với một số ví dụ trong đó làm tròn là một lợi ích không tầm thường. Tôi đã trả lời phần đầu tiên, đó là hầu hết các thuật toán sẽ được hưởng lợi. – Gabe

2

Một số ví dụ: Sản phẩm chấm vector. Biến đổi Fourier. Xử lý tín hiệu số. Đa thức. Tất cả mọi thứ.

Đó là câu hỏi tối ưu hóa và khai thác phần cứng nhiều hơn bất kỳ điều gì khác. Tổng sản phẩm là một yêu cầu rất phổ biến trong các phương pháp số, và cách này cho phép bạn đưa ra một chỉ dẫn rõ ràng cho trình biên dịch về cách làm một điều nhanh và có lẽ với độ chính xác cao hơn một chút. Trừ khi tôi bị nhầm lẫn, trình biên dịch được tự do thay thế a = b * c + d bằng lệnh FMA, nhưng nó cũng không miễn phí. (trừ khi các cuộc gọi chuẩn cho làm tròn, nhưng các trình biên dịch thực tế thường xuyên vi phạm các tiêu chuẩn theo những cách nhỏ).

+1

Trình biên dịch không thể thay thế một cách hợp pháp b * c + d bằng FMA trừ khi bạn nói cụ thể trình biên dịch là OK (với toán -ffast-math hoặc một cái gì đó tương tự), bởi vì nó làm nhiễu loạn kết quả. –

+0

@StephenLin: Giả sử rằng việc đánh giá 'b',' c' và 'd' không làm thay đổi trạng thái hoặc có các tác dụng phụ khác, làm thế nào để tối ưu hóa phần cứng" kết quả nhiễu loạn "? – stakx

+0

@stakx: Nhiều hướng dẫn tổng hợp trong tập lệnh dấu phẩy động có ở đó vì lỗi làm tròn sẽ làm lu mờ kết quả. Ví dụ: nếu bạn lấy e^(gần bằng không) kết quả là gần một, nhưng điều đó giới hạn độ chính xác của bạn rất nhiều. Nếu bạn có một lệnh đại diện cho e^epsilon-1, thì phần cứng có thể cho độ chính xác cao hơn nhiều. Bất kỳ ngôn ngữ cấp cao nhất định nào cũng có thể được định nghĩa là cung cấp quyền truy cập vào hướng dẫn chính xác hơn hoặc viết lại cây biểu thức trong các trường hợp dễ nhận biết. Cái trước là dễ dự đoán hơn. – Ian

4

Điều duy nhất tôi tìm thấy cho đến nay là "biến đổi không có lỗi". Đối với bất kỳ lỗi số dấu phẩy động nào từ a+b, a-ba*b cũng là số dấu chấm động (trong vòng tới chế độ gần nhất, giả sử không có tràn/tràn, v.v.).

Lỗi bổ sung (và rõ ràng là trừ) rất dễ tính; nếu abs(a) >= abs(b), lỗi chính xác là b-((a+b)-a) (2 thất bại, hoặc 4-5 nếu chúng ta không biết cái nào lớn hơn). Lỗi nhân là tầm thường để tính toán với fma - nó chỉ đơn giản là fma(a,b,-a*b). Nếu không có fma đó là 16 flops của mã khá khó chịu. Và giả lập hoàn toàn chung của một cách chính xác làm tròn fma thậm chí còn chậm hơn thế.

Thêm 16 lần theo dõi lỗi cho mỗi lần thực hiện tính toán thực sự là quá mức cần thiết, nhưng chỉ với 1-5 lần thử nghiệm thân thiện với đường ống khá hợp lý và đối với nhiều thuật toán dựa trên 50% -200% chi phí và bù lại kết quả là lỗi nhỏ như thể tất cả các phép tính đã được thực hiện gấp đôi số bit chúng, tránh điều kiện bị lỗi trong nhiều trường hợp.

Điều thú vị là, fma không bao giờ được sử dụng trong các thuật toán này để tính toán kết quả, chỉ để tìm lỗi, vì tìm lỗi fma chậm như tìm lỗi nhân không có fma.

Từ khóa có liên quan để tìm kiếm sẽ là "giao thức Horner được đền bù" và "sản phẩm chấm được đền bù", với chương trình Horner mang lại lợi ích nhiều hơn nữa.

+0

Tôi tự hỏi chi phí phần cứng của FMA trên các giá trị 'float' sẽ so sánh với chi phí phần cứng của một thao tác đã thêm sản phẩm có độ chính xác đầy đủ của hai giá trị' float' vào 'double'. Theo hiểu biết của tôi, phần cứng chi phí của một nhân đôi gấp đôi gấp bốn lần so với tốc độ chính xác cao, và đối với nhiều hoạt động như dot-product, cần phải duy trì các giá trị trung gian với nhiều hơn chính xác hơn so với toán hạng hoặc kết quả cuối cùng. Sử dụng một nhân và fma với nhau có thể làm việc, nhưng sử dụng một hoạt động f * f + d sẽ có vẻ nhanh gấp hai lần. – supercat

1

Nó đã được giải thích khá tốt trên Wikipedia entry for FMA rằng các thuật toán mà có cái gì để làm với tích lũy các sản phẩm hưởng lợi nhiều nhất từ ​​việc sử dụng FMA:

A fast FMA can speed up and improve the accuracy of 
many computations that involve the accumulation of products: 

* Dot product 
* Matrix multiplication 
* Polynomial evaluation (e.g., with Horner's rule) 
* Newton's method for evaluating functions. 
Các vấn đề liên quan