Cấu hình mã CFD với Callgrind


16

Tôi đang sử dụng Valgrind + Callgrind để lập hồ sơ một người giải tôi đã viết. Như hướng dẫn sử dụng Valgrind, tôi đã biên dịch mã của mình với các tùy chọn gỡ lỗi cho trình biên dịch:

"Không có thông tin gỡ lỗi, các công cụ Valgrind tốt nhất sẽ có thể làm là đoán chức năng của một đoạn mã cụ thể, điều này làm cho cả thông báo lỗi và đầu ra hồ sơ gần như vô dụng. Với -g, bạn sẽ nhận được thông báo trỏ trực tiếp đến các dòng mã nguồn có liên quan. "

Hướng dẫn sử dụng Valgrind

Khi được biên dịch với tùy chọn gỡ lỗi, các mã chạy chậm hơn nhiều. Mã CFD, trở nên THỰC SỰ chậm, ngay cả đối với các trường hợp nhỏ khi được biên dịch với cờ gỡ lỗi. Valgrind làm cho nó chậm hơn 40 lần (xem hướng dẫn 1 ).

  1. Những công cụ nào bạn đang sử dụng để định hình mã (hồ sơ, không phải điểm chuẩn)?

  2. Bạn để mã chạy trong bao lâu (thống kê: bao nhiêu bước thời gian)?

  3. Các trường hợp lớn đến mức nào (nếu trường hợp vừa trong bộ đệm, bộ giải là các đơn đặt hàng có cường độ nhanh hơn, nhưng sau đó tôi sẽ bỏ lỡ các quy trình liên quan đến bộ nhớ)?


3
Bạn có thể biên dịch mã với cả biểu tượng gỡ lỗi và kích hoạt tối ưu hóa. Tuy nhiên, 40x thông qua valgrind (mô phỏng tất cả truy cập bộ nhớ) không phải là không có lý.
Aron Ahmadia

Cảm ơn, đây cũng là những gì tôi đã đọc ... những gì tôi muốn biết là thông tin về những trải nghiệm hàng ngày trong hồ sơ (tốt nhất là với valgrind): bao nhiêu thời gian là bình thường để chờ đợi các báo cáo, bao nhiêu lần lặp lại tôi cần đếm, tôi có thể loại trừ những gì ... vv ...
tmaric

Câu hỏi của bạn cũng hơi rộng. Tôi khuyên bạn nên chỉnh sửa câu hỏi của mình để tập trung vào Q2.1 và Q2.2, vì Q1 là một câu hỏi hoàn toàn khác (tôi rất vui khi bạn hỏi riêng, đây là một câu hỏi hay, nhưng hãy đặt câu hỏi là "Bạn sẽ sử dụng công cụ nào sử dụng để giải quyết vấn đề X ", trong đó X được mô tả tốt!), trong khi bản thân Q2 thì quá chung chung.
Aron Ahmadia

Bạn cũng có thể chỉnh sửa tên callgrind, cachegrindhoặc massif. Nhiều người chỉ liên kết Valgrind với công cụ mặc định ( memcheck). Là một hệ thống định hình dựa trên mô phỏng (chứ không phải dựa trên ngắt), bạn không cần phải chạy trong một thời gian dài.
Jed Brown

@Aron & Jed: cảm ơn vì những lời khuyên, tôi đã chỉnh sửa câu hỏi. :)
tmaric

Câu trả lời:


11

Câu 1: Bạn đang sử dụng công cụ nào để lập hồ sơ mã (lược tả, không phải điểm chuẩn)?

Câu 2: Bạn để mã chạy trong bao lâu (thống kê: bao nhiêu bước thời gian)?

Câu 3: Các trường hợp lớn đến mức nào (nếu trường hợp vừa trong bộ đệm, bộ giải là các đơn đặt hàng có cường độ nhanh hơn, nhưng sau đó tôi sẽ bỏ lỡ các quy trình liên quan đến bộ nhớ)?

Đây là một ví dụ về cách tôi làm điều đó.

Tôi tách điểm chuẩn (xem mất bao lâu) từ hồ sơ (xác định cách làm cho nhanh hơn). Điều quan trọng không phải là trình hồ sơ nhanh. Điều quan trọng là nó cho bạn biết những gì cần sửa chữa.

Tôi thậm chí không thích từ "profiling" bởi vì nó gợi ra một hình ảnh giống như biểu đồ, trong đó có một thanh chi phí cho mỗi thói quen, hoặc "nút cổ chai" bởi vì nó chỉ có một vị trí nhỏ trong mã cần phải có đã sửa. Cả hai điều này đều ngụ ý một số loại thời gian và số liệu thống kê mà bạn cho rằng độ chính xác là quan trọng. Nó không đáng để từ bỏ cái nhìn sâu sắc về tính chính xác của thời gian.

Phương pháp tôi sử dụng là tạm dừng ngẫu nhiên, và có một nghiên cứu tình huống và trình chiếu đầy đủ ở đây . Một phần của quan điểm thế giới tắc nghẽn hồ sơ là nếu bạn không tìm thấy gì, sẽ không tìm thấy gì, và nếu bạn tìm thấy thứ gì đó và tăng tốc phần trăm nhất định, bạn tuyên bố chiến thắng và bỏ cuộc. Người hâm mộ Profiler hầu như không bao giờ nói họ tăng tốc bao nhiêu và quảng cáo chỉ hiển thị các vấn đề giả tạo được thiết kế để dễ tìm. Tạm dừng ngẫu nhiên tìm thấy các vấn đề cho dù chúng dễ hay khó. Sau đó, sửa một vấn đề làm lộ ra những vấn đề khác, vì vậy quá trình có thể được lặp lại, để có được sự tăng tốc gộp.

Theo kinh nghiệm của tôi từ nhiều ví dụ, đây là cách nó diễn ra: Tôi có thể tìm thấy một vấn đề (bằng cách tạm dừng ngẫu nhiên) và khắc phục nó, tăng tốc một số phần trăm, giả sử 30% hoặc 1,3 lần. Sau đó, tôi có thể làm lại, tìm một vấn đề khác và khắc phục nó, tăng tốc độ khác, có thể ít hơn 30%, có thể nhiều hơn. Sau đó, tôi có thể làm lại, nhiều lần cho đến khi tôi thực sự không thể tìm thấy gì khác để khắc phục. Yếu tố tăng tốc cuối cùng là sản phẩm chạy của các yếu tố riêng lẻ, và nó có thể lớn đến mức đáng kinh ngạc - các đơn đặt hàng cường độ trong một số trường hợp.

XÁC NHẬN: Chỉ để minh họa điểm cuối cùng này. Có một ví dụ chi tiết ở đây , với trình chiếu và tất cả các tệp, cho thấy mức tăng tốc của 730x đã đạt được trong một loạt các vấn đề loại bỏ. Phiên bản đầu tiên mất 2700 micro giây trên mỗi đơn vị công việc. Vấn đề A đã được gỡ bỏ, đưa thời gian xuống còn 1800 và phóng đại tỷ lệ phần trăm của các vấn đề còn lại lên gấp 1,5 lần (2700/1800). Sau đó B được gỡ bỏ. Quá trình này tiếp tục qua sáu lần lặp lại, dẫn đến gần 3 bậc tăng tốc độ. Nhưng kỹ thuật định hình phải thực sự hiệu quả, bởi vì nếu không tìm thấy bất kỳ vấn đề nào trong số đó, tức là nếu bạn đạt đến điểm mà bạn nghĩ không chính xác thì không thể làm gì hơn nữa, quy trình bị đình trệ.

Mô tả loại bỏ nhiều vấn đề để có được tăng tốc lớn

XÁC NHẬN: Để nói theo một cách khác, đây là một biểu đồ về tổng yếu tố tăng tốc khi các vấn đề liên tiếp được loại bỏ:

nhập mô tả hình ảnh ở đây

Vì vậy, đối với Q1, đối với điểm chuẩn, bộ đếm thời gian đơn giản đủ. Để "định hình" tôi sử dụng tạm dừng ngẫu nhiên.

Câu 2: Tôi cho nó đủ khối lượng công việc (hoặc chỉ đặt một vòng lặp xung quanh nó) để nó chạy đủ lâu để tạm dừng.

Câu 3: Bằng mọi cách, hãy cung cấp cho nó khối lượng công việc thực tế lớn để bạn không bỏ lỡ các vấn đề về bộ đệm. Những cái đó sẽ hiển thị dưới dạng các mẫu trong mã thực hiện tìm nạp bộ nhớ.


Mike, bạn có thích làm thế nào để tạm dừng ngẫu nhiên trong trường hợp không có IDE trực quan không? Quá trình này có thể được tự động theo một cách nào đó?
Matthew Emmett

@Matthew: Tôi hiểu có những công cụ như pstacklsstack, nhưng tôi thực sự coi đây là một quá trình phổ biến hơn với gỡ lỗi. Vì vậy, ngay cả khi trình gỡ lỗi tốt nhất tôi có thể mang theo gdb, nó vẫn hoàn thành công việc. Với trình gỡ lỗi, bạn có thể kiểm tra dữ liệu và điều đó có thể tạo ra sự khác biệt khi chỉ riêng ngăn xếp không đủ cho bạn biết.
Mike Dunlavey

9

Trình hồ sơ của người nghèo về cơ bản là một gdbtập lệnh lấy mẫu ngăn xếp cuộc gọi. Bạn vẫn sẽ cần phải có các biểu tượng gỡ lỗi. Nó vẫn còn chậm, nhưng vì nó không triển khai một máy ảo để chạy mã trên nên nó thường nhanh hơn callgrindvà phù hợp với nhiệm vụ.

Tôi đã chạy trên các máy phân tích vật lý hạt với thành công khiêm tốn (nghĩa là tôi đã chứng minh rằng mã không có bất kỳ điểm nóng khủng khiếp nào và tối ưu hóa sẽ đòi hỏi một thuật toán tốt hơn).


1
+ Sự vắng mặt của bằng chứng không phải là bằng chứng của sự vắng mặt :) Điều mà người lập hồ sơ của người nghèo nên làm là lấy ít dấu vết hơn và không làm sụp đổ chúng, nhưng hãy để bạn nhìn thấy chúng. Mắt người tốt hơn nhiều trong việc phát hiện các mẫu hữu ích so với ước tính thời gian chức năng đơn giản và nếu bạn thấy thứ gì đó bạn có thể cải thiện chỉ với 2 mẫu, nó sẽ giúp ích đáng kể. Phân số X mà nó sẽ lưu là phân phối beta với chế độ 2 / N, trong đó N là số lượng dấu vết bạn đã kiểm tra và hệ số tăng tốc sẽ là 1 / (1-X), có thể lớn.
Mike Dunlavey

2

Để thêm vào các câu trả lời tuyệt vời có sẵn, có một công cụ được phát triển tại Rice tự động lấy mẫu ngăn xếp và do đó có rất ít chi phí:

http://hpctoolkit.org/


Điều đó có vẻ tốt, mặc dù (xin lỗi) Tôi đã đội chiếc mũ lửa của mình ở đây. Tôi không điều chỉnh mã được tối ưu hóa bởi trình biên dịch bởi vì thật khó để thấy những gì đang diễn ra trong mã được xử lý. Những điều tôi cắt tỉa không phải là những thứ mà trình tối ưu hóa có thể giải quyết - như gọi điện explogvới cùng một lập luận lặp đi lặp lại, hoặc các hoạt động ma trận dành tất cả các tùy chọn giải mã thời gian của chúng. Tôi điều chỉnh hết mức có thể, sau đó bật -O3.
Mike Dunlavey

Công cụ là công cụ và chỉ hữu ích nếu người dùng biết và hiểu những hạn chế của họ. Tôi không nghĩ sẽ có một "trình hồ sơ hoàn hảo" sẽ loại bỏ người dùng khỏi phương trình hoàn toàn liên quan đến việc hiểu đầu ra của nó và biết cách sử dụng thông tin.
Reid.Atcheson

1

Allinea MAP là một trình tạo mẫu lấy mẫu được hỗ trợ và phát triển thương mại và do đó - như Bộ công cụ HPC được đề xuất trong câu trả lời trước đó - có thể chạy trên các công việc có quy mô sản xuất nếu bạn muốn.

Loại công cụ này chỉ ra các tắc nghẽn CPU hoặc giao tiếp MPI kém, nhưng toàn bộ việc giám sát toàn bộ công việc có thể là vô giá trong việc tìm kiếm các vấn đề bất ngờ.

Thường có những loại trái cây có hiệu suất treo thấp nằm ngoài nhân lõi của mã CFD, ở những khu vực không được mong đợi. Lấy mẫu ngăn xếp ngẫu nhiên là - cho dù được thực hiện thủ công với GDB, hoặc với các công cụ như HPC Toolkit và Allinea MAP - cách tốt nhất để tìm thấy chúng. Nếu một cái gì đó quan trọng để thực hiện nó sẽ hiển thị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.