2011-10-13 38 views
5

Tôi muốn biết nếu có các công cụ có thểCông cụ để hình dung biểu đồ cuộc gọi ứng dụng đa luồng C++, phạm vi mã đa luồng?

  • Trợ giúp trực quan hóa biểu đồ cuộc gọi của ứng dụng đa luồng lớn.
  • Cụ thể là tôi muốn xem có bao nhiêu luồng xen kẽ trên một lõi/thực hiện đồng thời trên nhiều lõi.
  • Công cụ lý tưởng sẽ xác định các điều kiện chờ/bế tắc/đua có thể xảy ra.
  • Cuối cùng tôi muốn thực hiện bảo mật mã về cách các luồng tương tác với nhau trong suốt thời gian chạy (công cụ bảo vệ mã đa luồng) để tìm các lỗi đa luồng tiềm năng.

    Tôi xin lỗi nếu tôi chưa giải thích rõ ràng câu hỏi của mình và tôi rất muốn cung cấp bất kỳ chi tiết nào.

+0

Chúc may mắn, tôi sẽ theo dõi câu trả lời hợp lý. Tôi nghĩ rằng bạn cần phải có một sự hiểu biết đầy đủ về các chủ đề thực hiện bạn đang tách ra để đa. Có rất nhiều công cụ để lập hồ sơ và sản xuất đồ thị thực thi (fav là trình biên dịch hiệu suất của Redgate, đắt tiền nhưng tuyệt vời) nhưng không có chi tiết cụ thể bạn đang chụp trong bóng tối. – Justin

+0

@Justin Ah Tôi quên đề cập đến rằng ứng dụng tôi đang làm việc là trong C++. – fantasticsid

+0

@fantasticid: Tôi đã chỉnh sửa tiêu đề của bạn để phản ánh sở thích của bạn. –

Trả lời

1

VTune Profiler từ Intel có thể thực hiện một số điều bạn yêu cầu. Từ trang VTune:

Khóa và chờ: Sử dụng công cụ định dạng hiệu năng Intel® để tìm nhanh nguyên nhân phổ biến của hiệu năng chậm trong chương trình song song: chờ quá lâu khi lõi không được sử dụng quá mức trong khi chờ.

Dòng thời gian hiển thị hành vi chủ đề: Xem thời điểm các chủ đề đang chạy và đang chờ và khi xảy ra quá trình chuyển đổi.

Nếu bạn đang tìm kiếm một cái gì đó là mã nguồn mở/miễn phí, thì Valgrind có một công cụ thử nghiệm được gọi là Helgrind được cho là tìm thấy các chủng tộc trong các chương trình đa luồng. Tôi không thể nhận xét về nó, tôi đã không sử dụng nó.

Tôi nên lưu ý rằng tôi đã không thành công trong việc sử dụng những trình thu thập thông tin này để gỡ lỗi và tối ưu hóa đa luồng và thay vào đó tôi đã phát triển các kỹ thuật của riêng mình.

Để xác định sự tranh chấp khóa, kỹ thuật ưa thích của tôi là sử dụng một lớp Mutex mở rộng ghi lại tất cả các thao tác được thực hiện trên mỗi trường hợp. Tôi làm điều này một cách rất nhẹ, do đó hiệu suất ứng dụng không thay đổi theo một cách lớn.

Để xác định các điều kiện chủng tộc, tôi tìm thấy phương pháp tiếp cận vũ lực tốt nhất. Tôi chỉ thiết kế một thử nghiệm có thể chạy trong một khoảng thời gian dài, một số lần đây là giờ, hoặc ngày, tùy thuộc vào từng trường hợp. Và tôi luôn chạy thử nghiệm trên ít nhất hai nền tảng khác nhau (nếu tôi có thể), vì các hệ điều hành khác nhau sử dụng các bộ lập lịch khác nhau và cung cấp cho bạn mức độ phù hợp tốt hơn.

1

Trong khi tôi không thể giúp (chưa!) Trên hầu hết các vấn đề của bạn, tôi nghĩ công cụ C++ Test Coverage của chúng tôi có thể cung cấp cho bạn dữ liệu kiểm tra đa luồng khá dễ dàng.

Công cụ này cụ thể mã nguồn của bạn; bạn biên dịch và chạy nó. Bạn kết thúc với (giá rẻ) đầu dò thiết bị đo đạc trong mã của bạn đại diện cho các khối khác nhau. Thiết bị đo đạc ghi lại các phần nào của chương trình của bạn thực thi, được gọi là một bit bit với một bit là cho mỗi đầu dò thiết bị đo đạc. Khi kết thúc quá trình thực hiện (hoặc bất cứ khi nào bạn muốn), véc tơ bit này bị loại bỏ và người xem sẽ hiển thị nó cho bạn chồng lên mã.

Bí quyết để nhận phạm vi phủ sóng thử nghiệm nhiều lần là biết rằng chúng tôi cung cấp cho bạn kiểm soát hoàn chỉnh xác định cách thức hoạt động của thiết bị thăm dò; chúng là các macro. Vì vậy, thay vì sử dụng vĩ mô cơ bản mặc định của

probe[n]=true; 

trên một mảng boolean, bạn có thể thực hiện thay vì

probe[n]|=1<<threadid; 

trên một mảng int (hoặc một cái gì đó khéo léo rẻ hơn bởi precomputing giá trị này). Điều này có thể chỉ mất một vài dòng mã để triển khai.

Mọi người có thể lưu ý về mặt kỹ thuật này có sự cố đồng bộ hóa. Đó là sự thật, nhưng tối đa nó mất một chút dữ liệu về mức độ phù hợp và tỷ lệ cược so với tỷ lệ này khá cao. Hầu hết mọi người đều hài lòng với dữ liệu "khá tốt" thay vì hoàn hảo. Nếu bạn nhấn mạnh về sự hoàn hảo, bạn sẽ phải trả giá đồng bộ hóa cao bằng cách sử dụng một số hướng dẫn cập nhật nguyên tử .

Chúng tôi cũng cung cấp cho bạn quyền kiểm soát logic bán phá giá đầu dò; bạn có thể sửa đổi nó để viết ra dữ liệu bảo hiểm theo chủ đề cụ thể (trong hàng chục dòng mã tùy chỉnh). Trình xem dữ liệu phủ sóng thử nghiệm sau đó sẽ cho phép bạn xem phạm vi phủ định theo từng chủ đề (chỉ cần chọn đúng phạm vi phủ sóng); nó cũng có tích hợp sẵn cho dễ dàng tính toán/hiển thị giao lộ/union/diff trên vectơ vùng phủ sóng, cung cấp cho bạn chính xác mối quan hệ của bạn về mức độ phù hợp cho mỗi chuỗi.