2013-04-22 46 views
7

Tôi đã phân tích chương trình sau bằng cách sử dụng số profile của Matlab. Cả double và uint64 đều là các biến 64 bit. Tại sao so sánh hai đôi nhanh hơn nhiều so với hai uint64? Cả hai đều không được so sánh một chút?Tại sao so sánh gấp đôi nhanh hơn uint64?

big = 1000000; 

a = uint64(randi(100,big,1)); 
b = uint64(randi(100,big,1)); 
c = uint64(zeros(big,1)); 
tic; 
for i=1:big 
    if a(i) == b(i) 
     c(i) = c(i) + 1; 
    end 
end 
toc; 

a = randi(100,big,1); 
b = randi(100,big,1); 
c = zeros(big,1); 
tic; 
for i=1:big 
    if a(i) == b(i) 
     c(i) = c(i) + 1; 
    end 
end 
toc; 

Đây là phép đo của hồ sơ:

profile screenshot

Đây là những biện pháp tictoc:

Elapsed time is 6.259040 seconds. 
Elapsed time is 0.015387 seconds. 

Tác động biến mất khi uint8..uint32 hoặc int8..int32 là được sử dụng thay cho các kiểu dữ liệu 64 bit.

+0

Tôi không biết về Matlab, nhưng đôi khi thường được so sánh để xem liệu chúng có nằm trong khoảng cách epsilon của nhau hay không. Điều đó làm cho việc so sánh cồng kềnh hơn. –

+0

@EricJ. Không phải là trường hợp trong MATLAB, tôi sợ. Ngoài ra một chút bối rối bởi câu hỏi này. – jazzbassrob

+1

từ kết quả của bạn có vẻ như so sánh gấp đôi nhanh hơn nhiều so với uint64 – Jonas

Trả lời

6

Đây có thể là sự kết hợp giữa trình thông dịch Matlab và CPU cơ sở không hỗ trợ các loại int 64 bit cũng như các loại khác.

Ưu đãi Matlab double qua hoạt động int. Hầu hết các giá trị được lưu trữ trong các loại double, ngay cả khi chúng đại diện cho các giá trị số nguyên. Các hoạt động doubleint== sẽ có các đường dẫn mã khác nhau và MathWorks sẽ dành nhiều sự chú ý hơn vào việc điều chỉnh và tối ưu hóa mã cho double so với mã ints, đặc biệt là int64. Trên thực tế, các phiên bản cũ của Matlab không hỗ trợ các phép tính số học trên tất cả các hình ảnh int64. (Và IIRC, nó vẫn không hỗ trợ toán học số nguyên.) Khi bạn thực hiện toán học int64, bạn đang sử dụng mã ít trưởng thành hơn, ít bị điều chỉnh và điều tương tự cũng có thể áp dụng cho ==. Các loại Int không phải là ưu tiên trong Matlab. Sự hiện diện của int64 thậm chí có thể ảnh hưởng đến việc JIT tối ưu hóa mã đó, nhưng đó chỉ là một phỏng đoán.

Nhưng cũng có thể có lý do phần cứng cơ bản cho quá trình này. Đây là giả thuyết: nếu bạn đang sử dụng 32-bit x86, bạn đang làm việc với các thanh ghi 32-bit (mục đích chung). Điều đó có nghĩa là các kiểu int nhỏ hơn có thể vừa với thanh ghi và được so sánh bằng cách sử dụng các lệnh nhanh, nhưng các giá trị int 64-bit sẽ không vừa với thanh ghi và có thể mất các chuỗi lệnh đắt hơn để so sánh. Các double s, mặc dù chúng rộng 64 bit, sẽ vừa với thanh ghi điểm nổi rộng của đơn vị dấu chấm động x87, và có thể được so sánh trong phần cứng bằng cách sử dụng các chỉ lệnh so sánh dấu phẩy động nhanh. Điều này có nghĩa là [u]int64 s là những cái duy nhất không thể so sánh được bằng các thao tác đơn-đăng ký đơn, nhanh.

Nếu trường hợp đó xảy ra, nếu bạn chạy cùng mã này trên 64-bit x86-64 (trong Matlab 64 bit), sự khác biệt có thể biến mất vì bạn có thanh ghi mục đích chung rộng 64-bit. Nhưng sau đó một lần nữa, nó có thể không, nếu mã thông dịch của Matlab không được biên dịch để tận dụng nó.

+1

+1, dường như phần cứng chủ yếu là do lỗi ở đây. Tôi đã thử nghiệm trên R2010 trên một APU (có số học chính xác gấp đôi nhanh nhưng toán số nguyên khủng khiếp) và vấn đề giống hệt với 'đơn' và' (u) int8,16,33'. Sau đó, tôi đã thử nghiệm trên CPU 64-bit, R2012 Matlab 64 bit (có đăng ký mục đích chung rộng 64-bit), và tất cả các vấn đề đều biến mất. –

+0

@RodyOldenhuis: Ooh, hãy cho chúng tôi biết thêm về APU này bạn đang chạy. Nghe có vẻ thú vị và mới mẻ đối với tôi. –

+1

Xem [danh sách này] (http://en.wikipedia.org/wiki/List_of_AMD_Accelerated_Processing_Unit_microprocessors); Tôi có một chiếc AMD A6-3650, chủ yếu là nhờ vào sự tôn sùng của người quản lý CNTT của chúng tôi;) Cho đến nay, nó không tốt cho tôi; có rất nhiều tác dụng phụ lạ (như tôi đã đề cập trước đó). Đối với các tính toán/mô phỏng khoa học hiệu suất cao tôi đang làm/thiết kế, tôi thích CPU + GPU hơn bây giờ :) Cấp, APU của tôi khá mới và không thực sự tốt nhất ở đó, vì vậy tôi hy vọng điều này sẽ thay đổi trong tương lai (bởi vì tôi tin rằng họ có nhiều tiềm năng) –

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