Alat Diagnostik Paralel (Runtime Konkurensi)
Visual Studio menyediakan dukungan ekstensif untuk penelusuran kesalahan dan pembuatan profil aplikasi multi-utas.
Awakutu
Debugger Visual Studio mencakup jendela Tumpukan Paralel, jendela Tugas Paralel, dan jendela Parallel Watch. Untuk informasi selengkapnya, lihat Panduan: Men-debug Aplikasi Paralel dan Cara: Menggunakan Jendela Pengawasan Paralel.
Pemrofilan
Alat pembuatan profil menyediakan tiga tampilan data yang menampilkan informasi grafis, tabular, dan numerik tentang bagaimana aplikasi multi-utas berinteraksi dengan dirinya sendiri dan dengan program lain. Tampilan memungkinkan Anda mengidentifikasi area perhatian dengan cepat, dan menavigasi dari titik pada tampilan grafis ke tumpukan panggilan, situs panggilan, dan kode sumber. Untuk informasi selengkapnya, lihat Visualizer Konkurensi.
Pelacakan Peristiwa
Runtime Konkurensi menggunakan Pelacakan Peristiwa untuk Windows (ETW) untuk memberi tahu alat instrumentasi, seperti profiler, ketika berbagai peristiwa terjadi. Peristiwa ini termasuk ketika penjadwal diaktifkan atau dinonaktifkan, ketika konteks dimulai, berakhir, blok, buka blokir, atau hasil, dan ketika algoritma paralel dimulai atau berakhir.
Alat seperti Visualizer Konkurensi menggunakan fungsionalitas ini; oleh karena itu, Anda biasanya tidak perlu bekerja dengan peristiwa ini secara langsung. Namun, peristiwa ini berguna saat Anda mengembangkan profiler kustom atau saat Anda menggunakan alat pelacakan peristiwa seperti Windows Performance Toolkit.
Runtime Konkurensi hanya menaikkan peristiwa ini saat pelacakan diaktifkan. Panggil fungsi konkurensi::EnableTracing untuk mengaktifkan pelacakan peristiwa dan fungsi concurrency::D isableTracing untuk menonaktifkan pelacakan.
Tabel berikut ini menjelaskan peristiwa yang dinaikkan runtime saat pelacakan peristiwa diaktifkan:
Kejadian | Deskripsi | Nilai |
---|---|---|
konkurensi::ConcRT_ProviderGuid | Pengidentifikasi penyedia ETW untuk Runtime Konkurensi. | f7b697a3-4db5-4d3b-be71-c4d284e6592f |
konkurensi::ContextEventGuid | Menandai peristiwa yang terkait dengan konteks. | 5727a00f-50be-4519-8256-f7699871fecb |
concurrency::P PLParallelForEventGuid | Menandai pintu masuk dan keluar untuk memanggil algoritma konkurensi::p arallel_for . | 31c8da6b-6165-4042-8b92-949e315f4d84 |
konkurensi::P PLParallelForeachEventGuid | Menandai pintu masuk dan keluar untuk memanggil algoritma konkurensi::p arallel_for_each . | 5cb7d785-9d66-465d-bae1-4611061b5434 |
konkurensi::P PLParallelInvokeEventGuid | Menandai pintu masuk dan keluar untuk memanggil algoritma konkurensi::p arallel_invoke . | d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
konkurensi::SchedulerEventGuid | Menandai peristiwa yang terkait dengan Penjadwal Tugas. | e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
konkurensi::VirtualProcessorEventGuid | Menandai peristiwa yang terkait dengan prosesor virtual. | 2f27805f-1676-4ecc-96fa-7eb09d44302f |
Runtime Konkurensi mendefinisikan, tetapi saat ini tidak menaikkan, peristiwa berikut. Runtime mencadangkan peristiwa ini untuk digunakan di masa mendatang:
Enumerasi konkurensi::ConcRT_EventType menentukan kemungkinan operasi yang dilacak peristiwa. Misalnya, di pintu masuk parallel_for
algoritma, runtime meningkatkan PPLParallelForEventGuid
peristiwa dan menyediakan CONCRT_EVENT_START
sebagai operasi. parallel_for
Sebelum algoritma kembali, runtime kembali menaikkan PPLParallelForEventGuid
peristiwa dan menyediakan CONCRT_EVENT_END
sebagai operasi.
Contoh berikut mengilustrasikan cara mengaktifkan pelacakan untuk panggilan ke parallel_for
. Runtime tidak melacak panggilan pertama karena parallel_for
pelacakan tidak diaktifkan. Panggilan untuk EnableTracing
mengaktifkan runtime untuk melacak panggilan kedua ke parallel_for
.
// etw.cpp
// compile with: /EHsc
#include <ppl.h>
using namespace concurrency;
int wmain()
{
// Perform some parallel work.
// Event tracing is disabled at this point.
parallel_for(0, 10000, [](int i) {
// TODO: Perform work.
});
// Enable tracing for a second call to parallel_for.
EnableTracing();
parallel_for(0, 10000, [](int i) {
// TODO: Perform work.
});
DisableTracing();
}
Runtime melacak berapa kali Anda memanggil EnableTracing
dan DisableTracing
. Oleh karena itu, jika Anda memanggil EnableTracing
beberapa kali, Anda harus memanggil DisableTracing
frekuensi yang sama untuk menonaktifkan pelacakan.