2012-02-23 30 views
6

Tôi đã tìm thấy hiệu năng khá kém khi chạy một số mã tính toán theo Ubuntu trên một máy trạm không có thương hiệu mới mà tôi đang sử dụng để tính toán khoa học. Tôi nhận thấy một sự khác biệt trong tốc độ chạy một số mã hơi phức tạp trên Ubuntu so với trên máy tính xách tay Mac cũ của tôi mà tôi sử dụng để phát triển. Tuy nhiên, tôi đã quản lý để chưng cất nó xuống một ví dụ cực kỳ đơn giản mà vẫn thể hiện ít hơn Stelar cải tiến so với máy cũ của tôi:Hiệu suất thất vọng trong Ubuntu cho khối lượng công việc tính toán

#include <stdio.h> 
#include <math.h> 

int main() { 
     double res = 0.0; 
     for(int i=1; i<200000000; i++) { 
       res += exp((double) 100.0/i); 
     } 
     printf("%lf", res); 
     return(0); 
} 

Bây giờ Mac là một gần 5 năm 2.4GHz cũ Core 2 Duo MacBook Pro chạy OS X 10.5 chạy mã này trong khoảng 6,8 giây. Tuy nhiên, trên một thương hiệu mới 3,4GHz Core i7 Dell chạy Ubuntu 11,10 nó mất khoảng 6,1 giây! Ai đó có thể khai sáng cho tôi về những gì đang xảy ra ở đây không, bởi vì thật là vô lý khi một chiếc laptop gần 5 năm nằm trong vòng 10% của một máy trạm để bàn mới? Nó thậm chí còn vô lý hơn bởi vì tôi có thể thấy Core i7 turbo-boosting đến gần 4GHz với các công cụ giám sát!

Mac biên soạn với:

gcc -o test test.c -std=gnu99 -arch x86_64 -O2 

Ubuntu biên soạn với:

gcc -o test test.c -std=gnu99 -m64 -O2 -lm 

Cảm ơn,

Louis

+1

Nếu không có mã lắp ráp cho điều này là vô dụng. Các trình biên dịch có thể xuất ra các mã khác nhau (vì các triển khai thư viện khác nhau). Sẽ tốt hơn nếu có mã điểm chuẩn của trình lắp ráp để đảm bảo thời gian chạy. – Nobody

+0

Tôi hiểu những gì bạn đang nói, nhưng tôi sẽ không thể mã hóa ứng dụng khoa học của tôi trong assembly. Tôi không nghi ngờ rằng phần cứng thô nhanh hơn: vấn đề của tôi là máy trạm mới hoạt động kém với mã C đã biên dịch như được hiển thị và tôi muốn được trợ giúp để hiểu cách thức này có thể xảy ra. Nói cách khác: tôi phải làm gì để có được trạm làm việc mới để đăng số hiệu suất phù hợp hơn với 5 năm phát triển công nghệ đã trôi qua giữa Core 2 Duo và Core i7? – user1055918

+0

@ user1055918 Trình biên dịch tạo ra assembly chúng ta đang làm sau - chúng tôi không yêu cầu bạn viết assembly. OS X đã trễ CPU Intel - chúng thực hiện rất nhiều thứ khác nhau (ví dụ: chúng có thể giả định một số tập lệnh nhất định tồn tại). Đồng thời, các thư viện có thể khác nhau hoặc chúng có thể hoạt động (hơi) khác nhau. – justin

Trả lời

3

nó là vô lý rằng một máy tính xách tay cũ gần 5 năm là trong vòng 10% của một máy tính để bàn hoàn toàn mới cho máy tính để bàn

Lưu ý rằng bạn đang đo điểm chuẩn một chức năng cụ thể (exp). Chúng tôi không thực sự biết nếu hai việc triển khai chức năng exp() mà bạn đang đo điểm chuẩn là giống nhau (không thể tưởng tượng được rằng một trong số đó được tối ưu hóa tốt hơn cái kia).

Nếu bạn đã đánh giá một chức năng khác, kết quả có thể khá khác (có thể phù hợp hơn với mong đợi của bạn hoặc không).

Nếu exp() thực sự là nút cổ chai của ứng dụng thực tế của bạn, một khả năng là xem xét sử dụng xấp xỉ nhanh. Dưới đây là một giấy cung cấp một xấp xỉ như vậy: A Fast, Compact Approximation of the Exponential Function.

+0

Nó cũng rất có thể là một trong những thực hiện 'exp' là hoàn toàn ** sai **, tức là cho kết quả không chính xác cho nhiều đầu vào. Thư viện toán học kém phổ biến hơn bạn nghĩ, đặc biệt là với sự căng thẳng giữa những người muốn kết quả chính xác cho máy tính khoa học và những người chơi trò chơi muốn trò chơi 3D của họ chạy nhanh nhất có thể và không quan tâm nếu màn hình hoặc vật lý hơi đến mức độ vừa phải. –

+0

@aix Cảm ơn, vâng tôi đoán tôi đã giả định Apple đã sử dụng thư viện toán học GNU chuẩn với nó là một cơ sở Unix trong OS X, nhưng có vẻ như không. Tuy nhiên, tôi khá ngạc nhiên khi một hàm trưởng thành như exp() sẽ có hiệu suất kém hơn đáng kể trong Linux. Tôi nhận được câu trả lời giống hệt nhau về số lượng, vì vậy tôi không nghĩ rằng việc triển khai Mac là hy sinh tính chính xác. – user1055918

+0

@ user1055918: OS/X phải hỗ trợ một phạm vi rất hạn chế của CPU, trong khi Linux phải hỗ trợ phạm vi rộng hơn nhiều. Một khả năng là trên OS/X, 'libm.a' được biên dịch để sử dụng một số tính năng phần cứng gần đây mà phiên bản Linux không thể sử dụng trong khi vẫn còn lưu động rộng rãi. – NPE

0

Bạn đang so sánh táo và cam, đối với Mac, bạn cho phép tối ưu hóa kiến ​​trúc cụ thể mà bạn không dùng cho ubuntu. Sử dụng -O3 -march=native trên cả hai để có so sánh công bằng.

+1

Tôi đã thử các tùy chọn này trên hộp Ubuntu của mình, và chúng không có sự khác biệt đáng kể về hiệu năng. – NPE

+1

Cảm ơn Jens - Tôi đã thử điều đó và cũng đã thử -march = corei7, nhưng không có sự khác biệt về tốc độ, vì vậy tôi nghĩ rằng vấn đề là từ những nơi khác trong trường hợp này. – user1055918

0

Một số điều cần thử:

  • Hãy chắc chắn rằng CPU của bạn được thiết lập để chạy cố định ở tốc độ cao của nó trong thí nghiệm. Nó có thể được chuyển đổi qua lại lên xuống, có thêm rất nhiều chi phí
  • Pin các chương trình thử nghiệm với một lõi bằng taskset, do đó lịch trình hệ điều hành không di chuyển nó xung quanh
+0

Cảm ơn, không biết về 'taskset' ... Tôi vừa học được một công cụ Linux mới. Thật không may, nó không hiển thị một sự khác biệt trong thời gian mặc dù. Tôi đã sử dụng cpufreq-set để thay đổi thống đốc thành hiệu suất và không có sự thay đổi đáng kể về mặt thống kê. Ý tưởng tốt đẹp để thử mặc dù, cảm ơn. – user1055918

1

Như những người khác chú ý, bạn' chỉ đơn giản là đánh giá lại một triển khai thư viện toán học của exp() so với cách khác. Nếu bạn cần thư viện toán học chất lượng cao trên Linux, tôi khuyên bạn nên xem xét các công cụ biên dịch của Intel (đi kèm với một bộ thư viện tuyệt vời); chúng cũng có sẵn cho OS X và Windows.

+0

Có, tôi nhận được ấn tượng rằng có sự hội tụ của ý kiến ​​ở đây rằng nó là xuống đến thư viện hệ thống. Đây là một cái gì đó của một bất ngờ với tôi như tôi ngây thơ nghĩ rằng một cái gì đó giống như tính toán exp() sẽ được tối ưu hóa vào lãng quên theo mặc định. Nó chỉ là một nút cổ chai mà tôi đã có thể pin xuống, nhưng tôi chắc chắn mã thực sự của tôi sẽ có những người khác. Có bất kỳ thư viện toán học miễn phí nào (a-la ATLAS trong không gian BLAS) giúp tăng tốc hoạt động toán học không? Tôi không nghĩ rằng tôi có thể kéo dài đến đắt tiền (?) Intel trình biên dịch! – user1055918

+0

@ user1055918: Không tắt đầu của tôi; các thư viện ICC là những thư viện duy nhất trên Linux tôi có bất kỳ trải nghiệm cá nhân nào và sẽ cảm thấy thoải mái khi giới thiệu. Hy vọng rằng người khác có thể chỉ cho bạn một hướng tốt. –

0

sự khác biệt về số chu kỳ CPU chỉ là 30%. Cho rằng chúng tôi không biết chính xác mã trình biên dịch tạo ra tôi sẽ không nói nó vô lý. Hầu hết hiệu suất đạt được với cpu mới của bạn là số lõi, và mã của bạn không sử dụng điều đó.

Cũng có thể thú vị khi thử và bỏ vòng lặp. Tỷ lệ tốc độ có thể thay đổi.

int main() { 
    double res0 = 0.0;   
    double res1 = 0.0;   
    double res2 = 0.0;   
    double res3 = 0.0;   
    double res4 = 0.0;   
    for(int i=1; i<200000000; i+=5) { 
      res0 += exp((double) 100.0/i); 
      res1 += exp((double) 100.0/(i+1)); 
      res2 += exp((double) 100.0/(i+2)); 
      res3 += exp((double) 100.0/(i+3)); 
      res4 += exp((double) 100.0/(i+4)); 
    } 
    double res=res0+res1+res2+res3+res4; 
    printf("%lf", res); 
    return(0); 
} 
+3

Vòng lặp "chưa được kiểm tra" của bạn thực sự thay đổi hành vi do thực tế rằng việc bổ sung không phải là kết hợp. –

+0

Nếu bạn muốn thử những thứ như thế này, bạn nên chuyển trực tiếp sang OpenMP, gcc thực hiện tốt. Tôi chỉ cố gắng và nó mang lại cho tôi một tốc độ 3,29. –

+0

@R ..: quan sát tuyệt vời! –

1

Thử bật tùy chọn -ffast-math. Điều này có thể cung cấp cho bạn việc triển khai chính xác ít hơn về mặt đạo đức của exp(). Câu hỏi đặt ra là liệu bạn có muốn tạo ra câu trả lời có khả năng sai không.

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