7 1 0 2 n a J 3 Is Parallel Programming Hard, And, If So, What Can You Do ] C About It? D . s c [ Editedby: 1 v PaulE.McKenney 4 5 LinuxTechnologyCenter 8 IBMBeaverton 0 0 [email protected] . 1 0 January3,2017(m) 7 1 : v i X r a ii Legal Statement This work represents the views of the editor and the authors and does not necessarily represent the view of their respectiveemployers. Trademarks: • IBM,zSeries,andPowerPCaretrademarksorregisteredtrademarksofInternationalBusinessMachinesCorpora- tionintheUnitedStates,othercountries,orboth. • LinuxisaregisteredtrademarkofLinusTorvalds. • i386isatrademarkofIntelCorporationoritssubsidiariesintheUnitedStates,othercountries,orboth. • Othercompany,product,andservicenamesmaybetrademarksorservicemarksofsuchcompanies. The non-source-code text and images in this document are provided under the terms of the Creative Commons Attribution-ShareAlike3.0UnitedStateslicense.1 Inbrief,youmayusethecontentsofthisdocumentforanypurpose, personal,commercial,orotherwise,solongasattributiontotheauthorsismaintained. Likewise,thedocumentmay bemodified,andderivativeworksandtranslationsmadeavailable,solongassuchmodificationsandderivationsare offeredtothepubliconequaltermsasthenon-source-codetextandimagesintheoriginaldocument. SourcecodeiscoveredbyvariousversionsoftheGPL.2 SomeofthiscodeisGPLv2-only,asitderivesfromthe Linuxkernel,whileothercodeisGPLv2-or-later. Seethecommentheadersoftheindividualsourcefileswithinthe CodeSamples directory in the git archive3 for the exact licenses. If you are unsure of the license for a given code fragment,youshouldassumeGPLv2-only. Combinedwork©2005-2017byPaulE.McKenney. 1http://creativecommons.org/licenses/by-sa/3.0/us/ 2http://www.gnu.org/licenses/gpl-2.0.html 3git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/perfbook.git Contents 1 HowToUseThisBook 1 1.1 Roadmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 QuickQuizzes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 AlternativestoThisBook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4 SampleSourceCode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.5 WhoseBookIsThis? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 Introduction 7 2.1 HistoricParallelProgrammingDifficulties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 ParallelProgrammingGoals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.1 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.2 Productivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.3 Generality. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3 AlternativestoParallelProgramming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.1 MultipleInstancesofaSequentialApplication . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.2 UseExistingParallelSoftware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.3 PerformanceOptimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4 WhatMakesParallelProgrammingHard? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4.1 WorkPartitioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.2 ParallelAccessControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.3 ResourcePartitioningandReplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.4 InteractingWithHardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.4.5 CompositeCapabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.4.6 HowDoLanguagesandEnvironmentsAssistWithTheseTasks?. . . . . . . . . . . . . . . . 15 2.5 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3 HardwareanditsHabits 17 3.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.1 PipelinedCPUs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.2 MemoryReferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.1.3 AtomicOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.4 MemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.5 CacheMisses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.6 I/OOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2 Overheads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2.1 HardwareSystemArchitecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2.2 CostsofOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3 HardwareFreeLunch? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 iii iv CONTENTS 3.3.1 3DIntegration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.2 NovelMaterialsandProcesses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.3 Light,NotElectrons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3.4 Special-PurposeAccelerators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3.5 ExistingParallelSoftware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.4 SoftwareDesignImplications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4 ToolsoftheTrade 27 4.1 ScriptingLanguages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.2 POSIXMultiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.2.1 POSIXProcessCreationandDestruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.2.2 POSIXThreadCreationandDestruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.2.3 POSIXLocking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.2.4 POSIXReader-WriterLocking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.2.5 AtomicOperations(gccClassic) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.2.6 AtomicOperations(C11). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.7 Per-ThreadVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.3 AlternativestoPOSIXOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3.1 OrganizationandInitialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3.2 ThreadCreation,Destruction,andControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3.3 Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.3.4 AtomicOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.3.5 Per-CPUVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.3.6 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.4 TheRightToolfortheJob: HowtoChoose? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5 Counting 41 5.1 WhyIsn’tConcurrentCountingTrivial? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2 StatisticalCounters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2.1 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2.2 Array-BasedImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2.3 EventuallyConsistentImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5.2.4 Per-Thread-Variable-BasedImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.2.5 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.3 ApproximateLimitCounters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.3.1 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.3.2 SimpleLimitCounterImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 5.3.3 SimpleLimitCounterDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.3.4 ApproximateLimitCounterImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.3.5 ApproximateLimitCounterDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.4 ExactLimitCounters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.4.1 AtomicLimitCounterImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.4.2 AtomicLimitCounterDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.4.3 Signal-TheftLimitCounterDesign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.4.4 Signal-TheftLimitCounterImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.4.5 Signal-TheftLimitCounterDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.5 ApplyingSpecializedParallelCounters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.6 ParallelCountingDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.6.1 ParallelCountingPerformance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.6.2 ParallelCountingSpecializations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 CONTENTS v 5.6.3 ParallelCountingLessons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6 PartitioningandSynchronizationDesign 65 6.1 PartitioningExercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.1.1 DiningPhilosophersProblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.1.2 Double-EndedQueue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.1.3 PartitioningExampleDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 6.2 DesignCriteria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 6.3 SynchronizationGranularity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.3.1 SequentialProgram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.3.2 CodeLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.3.3 DataLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.3.4 DataOwnership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 6.3.5 LockingGranularityandPerformance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.4 ParallelFastpath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 6.4.1 Reader/WriterLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.4.2 HierarchicalLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.4.3 ResourceAllocatorCaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.5 BeyondPartitioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 6.5.1 Work-QueueParallelMazeSolver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 6.5.2 AlternativeParallelMazeSolver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 6.5.3 PerformanceComparisonI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 6.5.4 AlternativeSequentialMazeSolver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 6.5.5 PerformanceComparisonII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 6.5.6 FutureDirectionsandConclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 6.6 Partitioning,Parallelism,andOptimization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 7 Locking 95 7.1 StayingAlive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7.1.1 Deadlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7.1.2 LivelockandStarvation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.1.3 Unfairness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.1.4 Inefficiency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.2 TypesofLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.2.1 ExclusiveLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.2.2 Reader-WriterLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 7.2.3 BeyondReader-WriterLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 7.2.4 ScopedLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 7.3 LockingImplementationIssues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 7.3.1 SampleExclusive-LockingImplementationBasedonAtomicExchange . . . . . . . . . . . . 106 7.3.2 OtherExclusive-LockingImplementations . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.4 Lock-BasedExistenceGuarantees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 7.5 Locking: HeroorVillain?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 7.5.1 LockingForApplications: Hero!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 7.5.2 LockingForParallelLibraries: JustAnotherTool . . . . . . . . . . . . . . . . . . . . . . . . 109 7.5.3 LockingForParallelizingSequentialLibraries: Villain!. . . . . . . . . . . . . . . . . . . . . 111 7.6 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 vi CONTENTS 8 DataOwnership 115 8.1 MultipleProcesses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 8.2 PartialDataOwnershipandpthreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 8.3 FunctionShipping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 8.4 DesignatedThread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 8.5 Privatization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 8.6 OtherUsesofDataOwnership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 9 DeferredProcessing 119 9.1 RunningExample . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 9.2 ReferenceCounting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 9.3 HazardPointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 9.4 SequenceLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 9.5 Read-CopyUpdate(RCU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 9.5.1 IntroductiontoRCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 9.5.2 RCUFundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 9.5.3 RCUUsage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 9.5.4 RCULinux-KernelAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 9.5.5 “Toy”RCUImplementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 9.5.6 RCUExercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 9.6 WhichtoChoose? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 9.7 WhatAboutUpdates? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 10 DataStructures 167 10.1 MotivatingApplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 10.2 PartitionableDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 10.2.1 Hash-TableDesign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 10.2.2 Hash-TableImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 10.2.3 Hash-TablePerformance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 10.3 Read-MostlyDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 10.3.1 RCU-ProtectedHashTableImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 10.3.2 RCU-ProtectedHashTablePerformance . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 10.3.3 RCU-ProtectedHashTableDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 10.4 Non-PartitionableDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 10.4.1 ResizableHashTableDesign. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 10.4.2 ResizableHashTableImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 10.4.3 ResizableHashTableDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 10.4.4 OtherResizableHashTables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 10.5 OtherDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 10.6 Micro-Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 10.6.1 Specialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 10.6.2 BitsandBytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 10.6.3 HardwareConsiderations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 10.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 11 Validation 187 11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 11.1.1 WhereDoBugsComeFrom? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 11.1.2 RequiredMindset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 11.1.3 WhenShouldValidationStart? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 CONTENTS vii 11.1.4 TheOpenSourceWay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 11.2 Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 11.3 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 11.4 StaticAnalysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 11.5 CodeReview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 11.5.1 Inspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 11.5.2 Walkthroughs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 11.5.3 Self-Inspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 11.6 ProbabilityandHeisenbugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 11.6.1 StatisticsforDiscreteTesting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 11.6.2 AbusingStatisticsforDiscreteTesting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 11.6.3 StatisticsforContinuousTesting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 11.6.4 HuntingHeisenbugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 11.7 PerformanceEstimation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 11.7.1 Benchmarking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 11.7.2 Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 11.7.3 DifferentialProfiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 11.7.4 Microbenchmarking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 11.7.5 Isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 11.7.6 DetectingInterference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 11.8 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 12 FormalVerification 207 12.1 General-PurposeState-SpaceSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 12.1.1 PromelaandSpin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 12.1.2 HowtoUsePromela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 12.1.3 PromelaExample: Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 12.1.4 PromelaExample: QRCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 12.1.5 PromelaParable: dynticksandPreemptibleRCU . . . . . . . . . . . . . . . . . . . . . . . . 217 12.1.6 ValidatingPreemptibleRCUanddynticks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 12.2 Special-PurposeState-SpaceSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 12.2.1 AnatomyofaLitmusTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 12.2.2 WhatDoesThisLitmusTestMean? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 12.2.3 RunningaLitmusTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 12.2.4 PPCMEMDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 12.3 AxiomaticApproaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 12.4 SATSolvers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 12.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 13 PuttingItAllTogether 239 13.1 CounterConundrums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 13.1.1 CountingUpdates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 13.1.2 CountingLookups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 13.2 RefurbishReferenceCounting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 13.2.1 ImplementationofReference-CountingCategories . . . . . . . . . . . . . . . . . . . . . . . 240 13.2.2 LinuxPrimitivesSupportingReferenceCounting . . . . . . . . . . . . . . . . . . . . . . . . 244 13.2.3 CounterOptimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 13.3 RCURescues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 13.3.1 RCUandPer-Thread-Variable-BasedStatisticalCounters. . . . . . . . . . . . . . . . . . . . 245 13.3.2 RCUandCountersforRemovableI/ODevices . . . . . . . . . . . . . . . . . . . . . . . . . 246 viii CONTENTS 13.3.3 ArrayandLength . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 13.3.4 CorrelatedFields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 13.4 HashingHassles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 13.4.1 CorrelatedDataElements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 13.4.2 Update-FriendlyHash-TableTraversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 14 AdvancedSynchronization 251 14.1 AvoidingLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 14.2 MemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 14.2.1 MemoryOrderingandMemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 14.2.2 IfBFollowsA,andCFollowsB,WhyDoesn’tCFollowA? . . . . . . . . . . . . . . . . . . 253 14.2.3 VariablesCanHaveMoreThanOneValue . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 14.2.4 WhatCanYouTrust? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 14.2.5 ReviewofLockingImplementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 14.2.6 AFewSimpleRules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 14.2.7 AbstractMemoryAccessModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 14.2.8 DeviceOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 14.2.9 Guarantees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 14.2.10WhatAreMemoryBarriers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 14.2.11LockingConstraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 14.2.12Memory-BarrierExamples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 14.2.13TheEffectsoftheCPUCache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 14.2.14WhereAreMemoryBarriersNeeded? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 14.3 Non-BlockingSynchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 14.3.1 SimpleNBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 14.3.2 NBSDiscussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 15 ParallelReal-TimeComputing 279 15.1 WhatisReal-TimeComputing? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 15.1.1 SoftRealTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 15.1.2 HardRealTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 15.1.3 Real-WorldRealTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 15.2 WhoNeedsReal-TimeComputing? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 15.3 WhoNeedsParallelReal-TimeComputing? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 15.4 ImplementingParallelReal-TimeSystems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 15.4.1 ImplementingParallelReal-TimeOperatingSystems . . . . . . . . . . . . . . . . . . . . . . 286 15.4.2 ImplementingParallelReal-TimeApplications . . . . . . . . . . . . . . . . . . . . . . . . . 294 15.4.3 TheRoleofRCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 15.5 RealTimevs. RealFast: HowtoChoose? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 16 EaseofUse 299 16.1 WhatisEasy? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 16.2 RustyScaleforAPIDesign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 16.3 ShavingtheMandelbrotSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 17 ConflictingVisionsoftheFuture 303 17.1 TheFutureofCPUTechnologyAin’tWhatitUsedtoBe . . . . . . . . . . . . . . . . . . . . . . . . 303 17.1.1 UniprocessorÜberAlles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 17.1.2 MultithreadedMania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 17.1.3 MoreoftheSame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 CONTENTS ix 17.1.4 CrashDummiesSlammingintotheMemoryWall . . . . . . . . . . . . . . . . . . . . . . . . 305 17.2 TransactionalMemory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 17.2.1 OutsideWorld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 17.2.2 ProcessModification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 17.2.3 Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 17.2.4 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 17.3 HardwareTransactionalMemory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 17.3.1 HTMBenefitsWRTtoLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 17.3.2 HTMWeaknessesWRTLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 17.3.3 HTMWeaknessesWRTtoLockingWhenAugmented . . . . . . . . . . . . . . . . . . . . . 323 17.3.4 WhereDoesHTMBestFitIn? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 17.3.5 PotentialGameChangers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 17.3.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 17.4 FunctionalProgrammingforParallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 A ImportantQuestions 331 A.1 WhatDoes“After”Mean? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 A.2 WhatistheDifferenceBetween“Concurrent”and“Parallel”? . . . . . . . . . . . . . . . . . . . . . 333 A.3 WhatTimeIsIt? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 B WhyMemoryBarriers? 335 B.1 CacheStructure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 B.2 Cache-CoherenceProtocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 B.2.1 MESIStates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 B.2.2 MESIProtocolMessages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 B.2.3 MESIStateDiagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 B.2.4 MESIProtocolExample . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 B.3 StoresResultinUnnecessaryStalls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 B.3.1 StoreBuffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 B.3.2 StoreForwarding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 B.3.3 StoreBuffersandMemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 B.4 StoreSequencesResultinUnnecessaryStalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 B.4.1 InvalidateQueues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 B.4.2 InvalidateQueuesandInvalidateAcknowledge . . . . . . . . . . . . . . . . . . . . . . . . . 343 B.4.3 InvalidateQueuesandMemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 B.5 ReadandWriteMemoryBarriers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 B.6 ExampleMemory-BarrierSequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 B.6.1 Ordering-HostileArchitecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 B.6.2 Example1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 B.6.3 Example2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 B.6.4 Example3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 B.7 Memory-BarrierInstructionsForSpecificCPUs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 B.7.1 Alpha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 B.7.2 AMD64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 B.7.3 ARMv7-A/R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 B.7.4 IA64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 B.7.5 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 B.7.6 PA-RISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 B.7.7 POWER/PowerPC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 B.7.8 SPARCRMO,PSO,andTSO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 x CONTENTS B.7.9 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 B.7.10 zSeries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 B.8 AreMemoryBarriersForever? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 B.9 AdvicetoHardwareDesigners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 C AnswerstoQuickQuizzes 357 C.1 HowToUseThisBook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 C.2 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 C.3 HardwareanditsHabits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 C.4 ToolsoftheTrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 C.5 Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 C.6 PartitioningandSynchronizationDesign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 C.7 Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 C.8 DataOwnership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 C.9 DeferredProcessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 C.10 DataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 C.11 Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 C.12 FormalVerification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 C.13 PuttingItAllTogether . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 C.14 AdvancedSynchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 C.15 ParallelReal-TimeComputing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 C.16 EaseofUse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 C.17 ConflictingVisionsoftheFuture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 C.18 ImportantQuestions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 C.19 WhyMemoryBarriers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 D GlossaryandBibliography 437 E Credits 465 E.1 Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 E.2 Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 E.3 MachineOwners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 E.4 OriginalPublications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 E.5 FigureCredits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 E.6 OtherSupport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467