2010-08-28 30 views
6

Nói rằng tôi có một chương trình C trong pseudoish là:Điều gì được tính là một thất bại?

For i=0 to 10 
    x++ 
    a=2+x*5 
next 

Là số flops cho điều này (1 [x ++] + 1 [x * 5] + 1 [2+ (x + 5)) ] * 10 [vòng lặp], cho 30 FLOPS? Tôi đang gặp khó khăn khi hiểu được một thất bại là gì.

Lưu ý rằng [...] cho biết nơi tôi nhận được số lượng của tôi cho "hoạt động" từ.

+6

nitpick: flops ** FL ** thả nổi điểm ** O ** perations ** P ** er ** S ** econd, một thước đo về hiệu suất. FLOP được ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **. FLOP (chữ thường) là số nhiều của FLOP. –

+6

Bạn không đề cập đến các loại biến. Nếu tất cả là ints, nó là 0 flops. –

+4

FLOPS dành riêng cho các hoạt động điểm động. Có lẽ bạn đang quan tâm đến "chu kỳ" (số ticks nó cần CPU để thực hiện một số nhiệm vụ)? –

Trả lời

6

Với mục đích đo FLOPS, thường chỉ bao gồm các phép cộng và phép nhân. Những thứ như phân chia, đối ứng, căn bậc hai và hàm siêu việt là quá đắt để bao gồm như một thao tác đơn lẻ, trong khi những thứ như tải và cửa hàng thì quá tầm thường.

Nói cách khác, vòng lặp của bạn chứa 2 số cộng và 1 nhân, vì vậy (giả sử x là dấu phẩy động), mỗi vòng lặp lặp lại là 3 op; nếu bạn chạy vòng lặp 10 lần bạn đã thực hiện 30 ops.

Lưu ý rằng khi đo MIPS, vòng lặp của bạn sẽ có nhiều hơn 3 hướng dẫn vì nó cũng bao gồm tải và lưu trữ mà phép đo FLOPS không được tính.

7

FLOPS là viết tắt của hoạt động nổi trên giây. Nếu bạn đang xử lý các số nguyên thì bạn không có bất kỳ thao tác dấu phẩy động nào trong mã của bạn.

+6

Nó có vẻ như tác giả biết những gì flops phương tiện, và chỉ là yêu cầu mà hoạt động được bao gồm trong định nghĩa. – Gabe

1

Có phải x là số nguyên hoặc biến số dấu chấm động không? Nếu đó là số nguyên, thì vòng lặp của bạn có thể không chứa bất kỳ ảnh nào.

4

Các áp phích đã làm cho nó rõ ràng rằng FLOPS (chi tiết here) có liên quan với dấu chấm động (như trái ngược với số nguyên) hoạt động mỗi giây, vì vậy bạn không chỉ có để đếm có bao nhiêu hoạt động bạn đang thực hiện, nhưng trong khoảng thời gian nào.

Nếu "x" và "a" là nổi, bạn đang cố gắng đếm số lượng hoạt động trong mã của mình, nhưng bạn phải kiểm tra mã đối tượng để đảm bảo số lượng điểm nổi hướng dẫn thực sự được sử dụng. Ví dụ: nếu "a" không được sử dụng sau đó, trình biên dịch tối ưu hóa có thể không làm phiền để tính toán nó.

Ngoài ra, một số thao tác thả nổi (chẳng hạn như thêm) có thể nhanh hơn nhiều so với các thao tác khác (như nhân), do đó, vòng lặp chỉ thêm có thể chạy ở nhiều FLOPS hơn một vòng lặp chỉ nhân trên cùng một máy .

2

FLOP (các chữ thường cho biết số nhiều FLOP, theo nhận xét của Martinho Fernandes) là tham chiếu đến hướng dẫn điểm động của ngôn ngữ máy, do đó, nó phụ thuộc vào số lượng lệnh mà mã của bạn biên dịch xuống.

Trước hết, nếu tất cả các biến này là số nguyên, thì không có FLOP trong mã này. Tuy nhiên, giả sử rằng ngôn ngữ của bạn nhận ra tất cả các hằng số và các biến này là các biến số dấu chấm động chính xác đơn (sử dụng độ chính xác đơn làm cho việc tải các hằng số dễ dàng hơn).

Mã này có thể biên dịch (trên MIPS):

Assignment of variables: x is in $f1, a is in $f2, i is in $f3. 
All other floating point registers are compiler-generated temporaries. 
$f4 stores the loop exit condition of 10.0 
$f5 stores the floating point constant 1.0 
$f6 stores the floating point constant 2.0 
$t1 is an integer register used for loading constants 
    into the floating point coprocessor. 

    lui $t1, *upper half of 0.0* 
    ori $t1, $t1, *lower half of 0.0* 
    lwc1 $f3, $t1 
    lui $t1, *upper half of 10.0* 
    ori $t1, $t1, *lower half of 10.0* 
    lwc1 $f4, $t1 
    lui $t1, *upper half of 1.0* 
    ori $t1, $t1, *lower half of 1.0* 
    lwc1 $f5, $t1 
    lui $t1, *upper half of 2.0* 
    ori $t1, $t1, *lower half of 2.0* 
    lwc1 $f6, $t1 
st: c.gt.s $f3, $f4 
    bc1t end 
    add.s $f1, $f1, $f5 
    lui $t1, *upper half of 5.0* 
    ori $t1, $t1, *lower half of 5.0*   
    lwc1 $f2, $t1 
    mul.s $f2, $f2, $f1 
    add.s $f2, $f2, $f6 
    add.s $f3, $f3, $f5 
    j st 
end: # first statement after the loop 

Vì vậy, theo định nghĩa của Gabe của, có 4 thất bại bên trong vòng lặp (3x add.s và 1x mul.s). Có 5 FLOP nếu bạn cũng tính so sánh vòng lặp c.gt.s. Nhân số này với 10 cho tổng số 40 (hoặc 50) FLOP được chương trình sử dụng.

Trình biên dịch tối ưu hóa tốt hơn có thể nhận ra rằng giá trị a không được sử dụng bên trong vòng lặp, do đó, nó chỉ cần tính giá trị cuối cùng của a. Nó có thể tạo ra mã trông giống như

 lui $t1, *upper half of 0.0* 
    ori $t1, $t1, *lower half of 0.0* 
    lwc1 $f3, $t1 
    lui $t1, *upper half of 10.0* 
    ori $t1, $t1, *lower half of 10.0* 
    lwc1 $f4, $t1 
    lui $t1, *upper half of 1.0* 
    ori $t1, $t1, *lower half of 1.0* 
    lwc1 $f5, $t1 
    lui $t1, *upper half of 2.0* 
    ori $t1, $t1, *lower half of 2.0* 
    lwc1 $f6, $t1 
st: c.gt.s $f3, $f4 
    bc1t end 
    add.s $f1, $f1, $f5 
    add.s $f3, $f3, $f5 
    j st 
end: lui $t1, *upper half of 5.0* 
    ori $t1, $t1, *lower half of 5.0*   
    lwc1 $f2, $t1 
    mul.s $f2, $f2, $f1 
    add.s $f2, $f2, $f6 

Trong trường hợp này, bạn có 2 bổ sung và 1 so sánh bên trong vòng lặp (mutiplied 10 mang đến cho bạn 20 hoặc 30 flops), cộng với 1 nhân và 1 Ngoài ra bên ngoài vòng lặp. Do đó, chương trình của bạn hiện có 22 hoặc 32 FLOP tùy thuộc vào việc chúng tôi có tính các so sánh hay không.

+0

Tôi sẽ nói rằng gần như phổ biến trường hợp khi một vòng lặp trông giống như 'Đối với i = 0 đến 10',' i' là một số nguyên, và thân vòng lặp chạy 11 lần. – Gabe

+1

Đúng. Đây là để trình diễn. Quan điểm của tôi là nó tùy thuộc vào anh ta để hiểu ngữ nghĩa của ngôn ngữ của anh ta, và cách trình biên dịch của anh ấy tạo ra hội đồng, nếu anh ta đếm số FLOP. Nó không quan trọng như thế nào hư cấu giải thích của tôi về ngôn ngữ của mình là. –

Các vấn đề liên quan