Download presentation
Presentation is loading. Please wait.
1
Intel Software College
Correcting Threading Errors with Intel® Thread Checker for Explicit Threads Intel Software College
2
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Objectives After successful completion of this module you will be able to… Use Thread Checker to detect and identify a variety of threading correctness issues in Windows* threaded applications Determine if library functions are thread-safe Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Present the objectives of this module. Details Thread safety within libraries is an important issue, especially for third-party libraries. Intel® Thread Checker
3
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Agenda What is Intel® Thread Checker? Detecting race conditions Thread Checker as threading assistant Some other threading errors Checking library thread-safety Other features of Thread Checker Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Present the topics of the module. Intel® Thread Checker
4
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Motivation Developing threaded applications can be a complex task New class of problems are caused by the interaction between concurrent threads Data races or storage conflicts More than one thread accesses memory without synchronization Deadlocks Thread waits for an event that will never happen Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Provide some motivation to studying the Intel Thread Profiler. Details It is hard to locate and identify errors in threaded applications, especially when using standard debugging tools and techniques. The list is some of the correctness issues posed by multithreaded apps that are not found in serial codes. (These should be a quick review from previous modules.) Intel® Thread Checker
5
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Debugging tool for threaded software Finds threading bugs in Windows*, POSIX*, and OpenMP* threaded software Locates bugs quickly that can take days to find using traditional methods and tools Isolates problems, not the symptoms Bug does not have to occur to find it! Plug-in to VTune™ Performance Analyzer Same look, feel, and interface as VTune™ environment Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Show off some of the features and uses of Thread Checker. Details Helps to find all of those common pitfalls! The Symptoms are not demonstrated with Thread Checker, it goes beyond that and actually isolates the problems. (While the bug does not need to occur, the code containing the bug must be executed. This point is made again in 2 slides) Intel® Thread Checker
6
Intel® Thread Checker Features
Supports several different compilers Intel® C++ and Fortran Compilers, v7 and higher Microsoft* Visual* C++, v6 Microsoft* Visual* C++ .NET* 2002, 2003 & 2005 Editions Integrated into Microsoft Visual Studio .NET* IDE View (drill-down to) source code for Diagnostics One-click help for diagnostics Possible causes and solution suggestions API for user-defined synchronization primitives Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Provide information on supported compilers and some of the features of the tool. Details If code contains user-defined synchronization, Thread Checker will not be able to identify these (only the standard API sync). Thus, an API has been developed to denote user-defined sync methods. This assumes that the sync methods work correctly, of course. Intel® Thread Checker
7
Thread Checker: Analysis
Dynamic as software runs Data (workload) -driven execution Includes monitoring of: Thread and Sync APIs used Thread execution order Scheduler impacts results Memory accesses between threads Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Present the idea that Thread Checker is a dynamic tool and list what information TC will gather. Details Threading errors do not need to appear during Thread Checker analysis, but the code containing bugs must be instrumented and executed in order for the tool to identify these bugs. There is no way for Thread Checker to perform any kind of static analysis on parts of code that are not executed, nor can TC find problems in portions of the application or DLLs that are not instrumented. Code path must be executed to be analyzed Intel® Thread Checker
8
Thread Checker: Before You Start
Instrumentation: background Adds calls to library to record information Thread and Sync APIs Memory accesses Increases execution time and size Use small data sets (workloads) Execution time and space is expanded Multiple runs over different paths yield best results Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the idea of instrumentation and the consequences of such instrumentation. Workload selection is important! Intel® Thread Checker
9
Finds threading errors faster!
Workload Guidelines Execute problem code once per thread to be identified Use smallest possible working data set Minimize data set size Smaller image sizes Minimize loop iterations or time steps Simulate minutes rather than days Minimize update rates Lower frames per second Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Give some hints about how to decrease the execution time of TC analysis by data set reduction. Details Threaded and concurrent code with errors only needs to be executed once. If a reduction of data size cannot be easily achieved, the analysis can be terminated from the VTune GUI after a sufficient time has elapsed to reach and execute the threaded code of interest. Finds threading errors faster! Intel® Thread Checker
10
Building for Thread Checker
Compile Use dynamically linked thread-safe runtime libraries (/MD, /MDd) Generate symbolic information (/Zi, /ZI, /Z7) Disable optimization (/Od) Link Preserve symbolic information (/debug) Specify relocatable code sections (/fixed:no) Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Present the minimum compilation and linking requirements needed to run TC analysis. Details Use symbols so that Thread Checker can show source code. Aggressive levels of optimization can modify the order of code within an application. Disabling optimization will keep the binary code closer to the originally written source. Thus, with symbol information included, it will be much easier for Thread Checker to point out the lines of source that are involved in any threading errors that are identified. If a code displays threading errors with high-level optimizations (/O3), but doesn’t have any errors with optimization disabled, the problem is more likely with the compiler than with the threads in the application. (Besides, when using TC, we are not interested in the performance of the app, except to be sure we get some answers in a reasonable amount of time.) Intel® Thread Checker
11
Binary Instrumentation
Build with supported compiler Running the application Must be run from within Thread Checker Application is instrumented when executed External DLLs are instrumented as used Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Discuss what binary optimization is and how this is used within Thread Checker. Details Binary instrumentation adds code to application at thread API calls, memory access points, etc. (This is why the /fixed:no link option is required.) Intel® Thread Checker
12
Source Instrumentation
Intel® C++ or Fortran Compilers Compile with /Qtcheck Running the application Start in VTune™ environment Start from Windows* command line Data collected in threadchecker.thr results file View results (.thr file) in VTune™ environment Additional DLLs not instrumented or analyzed Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Discuss options for using source instrumentation. Details Only available from Intel compilers. Background If an application takes a long time to build, it may not be feasible to use source instrumentation on the whole of the source. However, if the binary was compiled and linked correctly, an initial pass can be done with binary instrumentation. This will at least reveal the modules that have threading errors. If they problem cannot be identified from these results, the specific source files involved can be recompiled with source instrumentation and the application re-run though TC. The source instrumentation will be able to give more details, like variable names, about the problems that were detected. More detailed diagnostics Intel® Thread Checker
13
Starting Thread Checker
Intel® Thread Checker Wizard Intel® Thread Profiler Wizard Advanced Activity Configuration 1) Must Select Threading Wizards Threading Wizards Intel® Thread Checker Wizard Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Show how to create a Thread Checker Activity. Details Build points out steps needed to get to Thread Checker Wizard. Transition Quote “Once you have started the Thread Checker Wizard, supply the information about the application to launch and command line arguments as you would with a VTune activity. After the app has run, you will see a Diagnostics pane come up looking something like…” 2) To see these Wizards Intel® Thread Checker
14
Thread Checker Diagnostics
Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Show the Diagnostics pane from a Thread Checker run. Details This is the default view of the Diagnostics pane. Briefly point out the columns and what they mean. Point out the legend in the lower right corner to identify different levels of severity in diagnostics. Point out the distribution histogram. Transition Quote “A flat list may not be much help, so we can group diagnostics to assist in the work to fix the problems. Grouping is done by dragging the column header of any displayed column into the top portion of the pane. For example,…” Intel® Thread Checker
15
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Diagnostics Grouping Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Show grouping of diagnostics by “Short Description”. Details Note that the distribution histogram display has changed to correspond to each of the new group categories. Can now deal with Write-Write or Read-Write or Write-Read errors. Transition Quote “To identify the source code that is associated with a diagnostic message, just double click on the diagnostic of interest.” Intel® Thread Checker
16
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Source Code Viewer Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Show Source code view pane within Thread Checker. Intel® Thread Checker
17
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Diagnostic Help 1) Right-click here . . . 2) More help! Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide How to get more details on an unknown diagnostic. Details The online help for diagnostics also includes some advice on the most common causes of the problem and, if appropriate, some common fixes to correct the error. Intel® Thread Checker
18
Activity 1a - Potential Energy
Build and run serial version Build threaded version Run application in Thread Checker to identify threading problems Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the first half of the First Lab Activity. Intel® Thread Checker
19
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Dependence Analysis S1: A = 1.0; S2: B = A ; S3: A = 1/3 * (C – D); S4: A = (B * 3.8) / 2.7; Consider the serial code: Flow dependence between S1 and S2 Value of A updated in S1 is used in S2 Anti dependence between S2 and S3 Value of A is read in S2 before written in S3 Output dependence between S3 and S4 Value of A assigned in S3 must occur before assignment in S4 Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Provide details on the concept and the ideas of dependence analysis in serial code. Details Dependence analysis is a topic that deals with optimization techniques, especially auto-parallelization, for serial codes. The slide is here to set the background for the race conditions diagnostics that are examined in the next slide. Instructor should note as clarification (and to lead into the next slide) the following “alternate” explanations for the dependence definitions: Flow: Write before Read Anti: Read before Write Output: Write before Write Any of these dependences requires that the statements involved must be executed in the same relative order to guarantee proper execution and results of the code. Transition Quote “So how does this relate to threaded codes and Thread Checker?” Intel® Thread Checker
20
Thread Checker Dependencies
Output dependence Write-Write conflict: one thread updates a variable that is subsequently updated by another thread Anti-dependence Read-Write conflict: one thread reads a variable that is subsequently updated by another thread Flow dependence Write-Read conflict: one thread updates a variable that is subsequently read by another thread Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Demonstrate the relation to dependence analysis and data race diagnostics from Thread Checker. Details While the code is run in parallel, Thread Checker will make a best guess about what kind of dependence is involved with a data contention diagnostic. This may involve the order of execution from serial code (if possible) or the order in which the threads have executed the statements involved. Thus, some pairs of lines may have both R/W (anti) and W/R (flow) dependences noted in the results. Background Guesses of Serial code order of execution can be better estimated from OpenMP codes, especially if dependence occurs on different iterations of a loop, since serial consistency is expected to be preserved by OpenMP code. Intel® Thread Checker
21
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Race Conditions Execution order is assumed but cannot be guaranteed Concurrent access of same variable by multiple threads Most common error in multithreaded programs May not be apparent at all times Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide (Introduce?) Review of Race Condition Intel® Thread Checker
22
Solving Race Conditions
Solution: Scope variables to be local to threads When to use Value computed is not used outside parallel region Temporary or “work” variables How to implement OpenMP scoping clauses (private, shared) Declare variables within threaded functions Allocate variables on thread stack TLS (Thread Local Storage) API Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Detail the FIRST method that can be employed to solve Data Races. Details Implementations are given for many different threading models. Intel® Thread Checker
23
Solving Race Conditions
Solution: Control shared access with critical regions When to use Value computed is used outside parallel region Shared value is required by each thread How to implement Mutual exclusion and synchronization Lock, semaphore, event, critical section, atomic… Rule of thumb: Use one lock per data element Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Detail the SECOND method that can be employed to solve Data Races. Details The set of sync objects available will be determined by the threading model used.. Transition Quote “Now that we’ve reviewed some of the ways to solve data races, let’s apply them to the potential energy code that we’ve analyzed with Thread Checker.” Intel® Thread Checker
24
Activity 1b - Potential Energy
Fix errors found by Thread Checker Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the second half of the First Lab Activity. Intel® Thread Checker
25
Implementation Assistant
When implementing threads Obvious shared and private variables can be identified and handled Should you analyze remaining variables for dependencies? What if parallel code is 100’s of lines long? What about variable use in called functions? Can you tell if pointers refer to same memory location? Use Thread Checker as a threading assistant Speculatively insert threading (OpenMP prototype?) Compile and run program in Thread Checker Review diagnostics Update directives and/or restructure Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Present how to make use of Thread Checker within the Design phase of the Threading Methodology. Details It is much easier to have TC do detailed analysis of threading correctness in large scale concurrent portions of the code. Let Thread Checker do the “heavy lifting” Intel® Thread Checker
26
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Deadlock Caused by thread waiting on some event that will never happen Most common cause is locking hierarchies Always lock and un-lock in the same order Avoid hierarchies if possible DWORD WINAPI threadA(LPVOID arg) { EnterCriticalSection(&L1); EnterCriticalSection(&L2); processA(data1, data2); LeaveCriticalSection(&L2); LeaveCriticalSection(&L1); return(0); } ThreadB: L2, then L1 DWORD WINAPI threadB(LPVOID arg) { EnterCriticalSection(&L2); EnterCriticalSection(&L1); processB(data2, data1) ; LeaveCriticalSection(&L1); LeaveCriticalSection(&L2); return(0); } Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Review concept of deadlock and give an example of locking hierarchies that lead to deadlock. Details It should be hoped that a single programmer that was writing both routines would not do this. However, if two separate coder were involved, they would both know that specs and need for mutual exclusion, but could still cause the example hierarchy. Transition Quote “This is a pretty obvious mistake and could be easily found and avoided. What about a more subtle case?” ThreadA: L1, then L2 Intel® Thread Checker
27
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Deadlock Add lock per element Lock only elements, not whole array of elements typedef struct { // some data things SomeLockType mutex; } shape_t; shape_t Q[1024]; void swap (shape_t A, shape_t B) { lock(a.mutex); lock(b.mutex); // Swap data between A & B unlock(b.mutex); unlock(a.mutex); } Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Another example of how deadlock might show up in the execution of a threaded application. Details If two threads will be accessing different elements of an array, why should we lock the whole array to allow only one thread to access at a time? Build Points: 1: In order to improve performance, we can add a lock to each element of an array rather than one to protect the whole array. 2: If we need to swap elements, we can write one routine that always locks the elements in the same order to avoid a locking hierarchy problem. 3: But, what if thread 1 wants to swap elements 34 and 986 while… 4: Thread 4 wants to swap elements 986 and 34? 5: We have created a deadlock if each thread gains access to their first lock before trying to access the lock held by the other thread. Questions to Ask Students Q: Is there anyway to guarantee that this locking hierarchy won’t happen? A: Maybe. It seems any solution will require checking the memory address of each lock and then locking them in some order (lowest first). This would add quite a bit of overhead and would be especially wasteful if this condition happened only every 1 out of 100 million times. swap(Q[34], Q[986]); Thread 1 Grabs mutex 34 swap(Q[986], Q[34]); Thread 4 Grabs mutex 986 Intel® Thread Checker
28
Be sure threads release all locks held
Thread Stalls Thread waits for an inordinate amount of time Usually on a resource Commonly caused by dangling locks Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Describe the concept of a thread stall, especially with regards to Thread Checker. Details May be caused by deadlock, but TC may not be able to determine that a true deadlock has occurred. Be sure threads release all locks held Intel® Thread Checker
29
Multi-core Programming: Intel Thread Checker Speaker’s Notes
What’s Wrong? int data; DWORD WINAPI threadFunc(LPVOID arg) { int localData; EnterCriticalSection(&lock); if (data == DONE_FLAG) return(1); localData = data; LeaveCriticalSection(&lock); process(local_data); return(0); } Lock never released Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Example that creates a dangling lock. Details If the thread finds valid data in the global, it is processed locally. If the termination signal is seen, then the thread returns, but does not release the lock. This causes any other thread want to use lock to be unable to gain access to it. Background This would not be a problem in a mutex object were used. Any mutex held by a thread that terminates will be noted as “abandoned” and can be locked by another thread. Locking an abandoned mutex will return an “error” code that notes the use of an abandoned mutex. Intel® Thread Checker
30
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Activity 2 - Deadlock Use Intel® Thread Checker to find and correct the potential deadlock problem. Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the Second Lab Activity. Intel® Thread Checker
31
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Thread Safe Routines All routines called concurrently from multiple threads must be thread safe How to test for thread safety? Use OpenMP and Thread Checker for analysis OpenMP simulator is systematic Use sections to create concurrent execution Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the idea of thread safety Details Use of OpenMP can be a quick and easy method to create concurrent execution of routines. Intel® Thread Checker
32
Multi-core Programming: Intel Thread Checker Speaker’s Notes
Thread Safety Example Check for safety issues between Multiple instances of routine1() Instances of routine1() and routine2() Set up sections to test all permutations Still need to provide data sets that exercise relevant portions of code #pragma omp parallel sections { #pragma omp section routine1(&data1); routine1(&data2); routine2(&data3); } Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Give example code of using OpenMP sections to set up an application that can test for routine thread safety. Details Need to test routine1 to be thread safe when another thread is calling the same routine; also, want to test the thread safety of routine1 and routine2 being called concurrently. Intel® Thread Checker
33
Two Ways to Ensure Thread Safety
Routines can be written to be reentrant Any variables changed by the routine must be local to each invocation Don’t modify globally shared variables Routines can use mutual exclusion to avoid conflicts with other threads If accessing shared variables cannot be avoided What if third-party libraries are not thread safe? Will likely need to control threads access to library It is better to make a routine reentrant than to add synchronization Avoids potential overhead Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Describe two methods to ensure thread safety of user-written routines. Details Method one: Reentrant code. Method two, if reentrant code is not possible: mutual exclusion code around each call. Background (Include any support material, stories, anecdotes, or references that might be helpful to the instructor.) <Remove these lines and start typing here; retain the sub-heading.> Questions to Ask Students Q: How do you tell if third-party libraries are thread safe? A: 1. Read the documentation. 2. Contact library author (especially if documentation is unclear or does not address the issue) 3. Test with Thread Checker (especially if you don’t trust the library author) Intel® Thread Checker
34
Activity 3 – Thread Safety
Use OpenMP framework to call library routines concurrently Three library calls = 6 combinations to test A:A, B:B, C:C, A:B, A:C, B:C Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the Third Lab Activity. Intel® Thread Checker
35
Instrumentation Levels
Description Full Image Each instruction in the module is instrumented to be checked to see if it might generate a diagnostic message. Custom Image Same as “Full Image” except user can disable selected functions from instrumentation. All Functions Turns on full instrumentation for those parts of a module that were compiled with debugging information. Custom Functions Same as “All Functions” except user can disable selected functions from instrumentation. API Imports Only system API functions that are needed to be instrumented by the tool will be instrumented. No user code is instrumented. Module Imports Disables instrumentation. This is default on system images, images without base relocations, and images not containing debug information. Higher levels increase memory usage and analysis time, but provide more details Binary instrumentation lowers level from default until successful Manually adjust level of instrumentation to increase speed or control amount of information gathered Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Describe the levels of binary instrumentation used within Thread Checker. Details The higher the level, the more info gained, but the more time and memory used. Instrumentation levels can be controlled down to the individual routine level if desired. Background Thread Checker 3.0 seems to have improved the binary instrumentation that is done. Thus, this slide may no longer be needed to support the previous lab exercise. Intel® Thread Checker
36
Large Diagnostics Counts
What do you do if you have 5000 diagnostics? Where do you begin debugging? Are all the diagnostic messages equally important/serious? Suggestions for organizing and prioritizing Add “1st Access” column Group by “1st Access” Sort by “Short Description” column Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Introduce the recommended procedures for dealing with a very large number of diagnostics. Details Not all message are equally important. One fix in the code may remove many related diagnostics. For example, making a variable local to each thread would remove all conflicts with that variable, which may be related to the number of lines of code the variable is referenced. “1st Access” is not one of the default columns. Intel® Thread Checker
37
Large Diagnostics Counts
Add the “1st Access” column if it not already present Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Give example screenshots to show how to accomplish the suggested grouping and organization. Details Build Points: 2: Right click to get context-sensitive menu and follow to the desired column to be added. Intel® Thread Checker
38
Large Diagnostics Counts
Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Continue example screenshots to show how to accomplish the suggested grouping and organization. Details New column has been added. Intel® Thread Checker
39
Large Diagnostics Counts
Groups errors reported for the same source line; each group can be seen as the same issue Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Continue example screenshots to show how to accomplish the suggested grouping and organization. Details Build Points: 0: circle has been removed from previous slide 1`: Move column header to top area in order to group diagnostics by selected column 2. Results of column header grouping. 3: Now, diagnostics are grouped by the line on which the first thread was executing that is involved in any chosen diagnostic. This essentially localizes all the errors by source code lines. Background (Include any support material, stories, anecdotes, or references that might be helpful to the instructor.) <Remove these lines and start typing here; retain the sub-heading.> Questions to Ask Students (Include any specific questions (and answers) that the instructor could/should ask to enhance understanding.) Transition Quote (Suggested dialog that can be used by the instructor to segue into the next slide.) Intel® Thread Checker
40
Large Diagnostics Counts
Sort on the “Short description” Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Conclude example screenshots to show how to accomplish the suggested grouping and organization. Details Build Points: 0: text box has been removed from previous slide 1: Clicking on column header will sort diagnostics within each group. This can focus work first on Write-Write errors. W-W are usually considered the most severe errors and solving these will likely solve related W-R and R-W errors. Intel® Thread Checker
41
Intel® Thread Checker What’s Been Covered
Threading errors are easy to introduce Debugging these errors by traditional techniques is hard Intel® Thread Checker catches these errors Errors do not have to occur to be detected Greatly reduces debugging time Improves robustness of the application Multi-core Programming: Intel Thread Checker Speaker’s Notes Purpose of the Slide Summary slide. Intel® Thread Checker
42
This should always be the last slide of all presentations.
Intel® Thread Checker
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.