
Intel® Guide for Developing Multithreaded Applications Part 2: Memory Management and Programming Tools Summary The Intel® Guide for Developing Multithreaded Applications provides a reference to design and optimization guidelines for developing efficient multithreaded applications across Intel-based symmetric multiprocessors (SMP) and/or systems with Intel® Hyper-Threading Technology. An application developer can source this technical guide to improve multithreading performance and minimize unexpected performance variations on current and future SMP architectures built with Intel processors. Part 2 is a collection of technical papers providing software developers with the most current technical information on memory management approaches and programming tools that help speed development and streamline parallel programming. Part 1 covers application threading and synchronization techniques for multithreaded applications. Each topic contains a standalone discussion of important threading issues, and complementary topics are cross-referenced throughout the guide for easy links to deeper knowledge. This guide provides general advice on multithreaded performance; is not intended to serve as a textbook on multithreading nor is it a porting guide to Intel platforms. Hardware-specific optimizations were deliberately kept to a minimum. Future versions of this guide will include topics covering hardware-specific optimizations for developers willing to sacrifice portability for higher performance. For online versions of individual articles, see: Intel Guide for Developing Multithreaded Applications Prerequisites Get more news for developers at: Intel® Software Network News Readers should have programming experience in a high-level language, preferably C, C++, and/or Fortran, though many recommendations in this document also apply to Java, C#, and Brought to you by Perl. Readers must also understand basic concurrent programming and be familiar with one or Intel® Software Dispatch Delivering the latest tools, more threading methods, preferably OpenMP*, POSIX threads (also referred to as Pthreads), techniques, and best practices for leading-edge software or the Win32* threading API. infrastructure, platform software, and developer resources. Developers are invited participate in online discussions on these topics at: Threading on Intel® Parallel Architectures forum. Table of Contents Memory Management Threads add another dimension to memory management that should not be ignored. This chapter covers memory issues that are unique to multithreaded applications. 3.1 - Avoiding Heap Contention Among Threads ...................................................................................p. 3 3.2 - Use Thread-local Storage to Reduce Synchronization .............................................................p. 8 3.3 - Detecting Memory Bandwidth Saturation in Threaded Applications ...............................p. 12 3.4 - Avoiding and Identifying False Sharing Among Threads ........................................................p. 16 Programming Tools This chapter describes how to use Intel software products to develop, debug, and optimize multithreaded applications. 4.1 - Automatic Parallelization with Intel® Compilers ...........................................................................p. 21 4.2 - Parallelism in the Intel® Math Kernel Library ..................................................................................p. 25 4.3 - Threading and Intel® Integrated Performance Primitives .......................................................p. 28 4.4 - Use Intel® Parallel Inspector to Find Race Conditions in OpenMP*-based Multithreaded Code......................................................................................................................................p. 34 4.5 - Curing Thread Imbalance Using Intel® Parallel Amplifier .........................................................p. 40 4.6 - Getting Code Ready for Parallel Execution with Intel® Parallel Composer ....................p. 46 2 Copyright © 2010 Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel Guide for Developing Multithreaded Applications | Memory Management 3.1 – Avoiding Heap Contention Among Threads Abstract Allocating memory from the system heap can be an expensive operation due to a lock used by system runtime libraries to synchronize access to the heap. Contention on this lock can limit the performance benefits from multithreading. To solve this problem, apply an allocation strategy that avoids using shared locks, or use third party heap managers. This article is part of the larger series, “Intel Guide for Developing Multithreaded Applications,” which provides guidelines for developing efficient multithreaded applications for Intel® platforms. Background The system heap (as used by malloc) is a shared resource. To make it safe to use by multiple threads, it is necessary to add synchronization to gate access to the shared heap. Synchronization (in this case lock acquisition), requires two interactions (i.e., locking and unlocking) with the operating system, which is an expensive overhead. Serialization of all memory allocations is an even bigger problem, as threads spend a great deal time waiting on the lock, rather than doing useful work. The screenshots from Intel® Parallel Amplifier in Figures 1 and 2 illustrate the heap contention problem in a multithreaded CAD application. Figure 1. Heap allocation routines and kernel functions called from them are the bottleneck consuming most of the application execution time. 3 Copyright © 2010 Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel Guide for Developing Multithreaded Applications | Memory Management Figure 2. The critical section used in the heap allocation routines was the most contended synchronization object, causing a significant amount of wait time and poor CPU utilization. Advice The OpenMP* implementation in the Intel® Compilers exports two functions: kmp_malloc and kmp_free. These functions maintain a per-thread heap attached to each thread utilized by OpenMP and avoid the use of the lock that protects access to the standard system heap. The Win32* API function HeapCreate can be used to allocate separate heaps for all of the threads used by the application. The flag HEAP_NO_SERIALIZE is used to disable the use of synchronization on this new heap, since only a single thread will access it. The heap handle can be stored in a Thread Local Storage (TLS) location in order to use this heap whenever an appli- cation thread needs to allocate or free memory. Note that memory allocated in this manner must be explicitly released by the same thread that performs the allocation. The example below illustrates how to use the Win32 API features mentioned above to avoid heap contention. It uses a dy- namic load library (.DLL) to register new threads at the point of creation, requests independently managed unsynchronized heap for each thread, and uses TLS to remember the heap assigned to the thread. 4 Copyright © 2010 Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel Guide for Developing Multithreaded Applications | Memory Management The pthread_key_create and pthread_{get|set}specific API can be used to obtain access to TLS in applications using POSIX* threads (Pthreads*), but there is no common API to create independent heaps. It is possible to allocate a big portion of memo- ry for each thread and store its address in TLS, but the management of this storage is the programmer’s responsibility. In addition to the use of multiple independent heaps, it is also possible to incorporate other techniques to minimize the lock contention caused by a shared lock that is used to protect the system heap. If the memory is only to be accessed within a small lexical context, the alloca routine can sometimes be used to allocate memory from the current stack frame. This memory is automatically deallocated upon function return. 5 Copyright © 2010 Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel Guide for Developing Multithreaded Applications | Memory Management Note, however that Microsoft has deprecated _alloca and recommends using the security enhanced routine called _mal- loca instead. It allocates either from the stack or from the heap depending on the requested size; therefore, the memory obtained from _malloca should be released with _freea. A per-thread free list is another technique. Initially, memory is allocated from the system heap with malloc. When the memo- 6 Copyright © 2010 Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel Guide for Developing Multithreaded Applications | Memory Management ry would normally be released, it is added to a per-thread linked list. If the thread needs to reallocate memory of the same size, it can immediately retrieve the stored allocation from the list without going back to the system heap. If the described techniques are not applicable (e.g., the thread that allocates the memory is not necessarily the thread that releases the memory) or memory management still remains a bottleneck, then it may be more appropriate to look into using a third party replacement to the heap manager. Intel® Threading Building Blocks (Intel® TBB) offers a multithreading-friendly memory manager
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages55 Page
-
File Size-