Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4Threading implementation << 27 // 26 // 28 // Author: Andrea Dotti, 15 February 2013 - Fi << 27 // -------------------------------------------------------------- 29 // Revision: Jonathan R. Madsen, 21 February 2 << 28 // GEANT 4 class implementation file 30 // ------------------------------------------- << 29 // >> 30 // G4Threading.cc >> 31 // >> 32 // --------------------------------------------------------------- >> 33 // Author: Andrea Dotti (15 Feb 2013): First Implementation >> 34 // --------------------------------------------------------------- 31 35 32 #include "G4Threading.hh" 36 #include "G4Threading.hh" 33 #include "G4AutoDelete.hh" 37 #include "G4AutoDelete.hh" 34 #include "G4AutoLock.hh" 38 #include "G4AutoLock.hh" 35 #include "globals.hh" 39 #include "globals.hh" 36 40 37 #if defined(_WIN32) << 41 #if defined (WIN32) 38 # include <windows.h> << 42 #include <Windows.h> 39 #else 43 #else 40 # include <sys/syscall.h> << 44 #include <unistd.h> 41 # include <sys/types.h> << 45 #include <sys/types.h> 42 # include <unistd.h> << 46 #include <sys/syscall.h> 43 #endif 47 #endif 44 48 45 #if defined(G4MULTITHREADED) 49 #if defined(G4MULTITHREADED) 46 50 47 # include <atomic> << 51 #include <atomic> 48 52 49 namespace 53 namespace 50 { 54 { 51 G4ThreadLocal G4int G4ThreadID = G4Threading << 55 G4ThreadLocal G4int G4ThreadID = G4Threading::MASTER_ID; 52 G4bool isMTAppType = false; << 56 G4bool isMTAppType = false; 53 } // namespace << 57 } 54 58 55 G4Pid_t G4Threading::G4GetPidId() 59 G4Pid_t G4Threading::G4GetPidId() 56 { 60 { 57 // In multithreaded mode return Thread ID << 61 // In multithreaded mode return Thread ID 58 return std::this_thread::get_id(); << 62 return std::this_thread::get_id(); 59 } 63 } 60 64 61 G4int G4Threading::G4GetNumberOfCores() 65 G4int G4Threading::G4GetNumberOfCores() 62 { 66 { 63 return std::thread::hardware_concurrency(); << 67 return std::thread::hardware_concurrency(); 64 } 68 } 65 69 66 void G4Threading::G4SetThreadId(G4int value) { << 70 void G4Threading::G4SetThreadId(G4int value ) { G4ThreadID = value; } 67 G4int G4Threading::G4GetThreadId() { return G4 71 G4int G4Threading::G4GetThreadId() { return G4ThreadID; } 68 G4bool G4Threading::IsWorkerThread() { return << 72 G4bool G4Threading::IsWorkerThread() { return (G4ThreadID>=0); } 69 G4bool G4Threading::IsMasterThread() { return << 73 G4bool G4Threading::IsMasterThread() { return (G4ThreadID==MASTER_ID); } 70 74 71 # if defined(__linux__) || defined(_AIX) << 75 #if defined(__linux__) || defined(_AIX) 72 G4bool G4Threading::G4SetPinAffinity(G4int cpu 76 G4bool G4Threading::G4SetPinAffinity(G4int cpu, G4NativeThread& aT) 73 { 77 { 74 cpu_set_t* aset = new cpu_set_t; << 78 cpu_set_t* aset = new cpu_set_t; 75 G4AutoDelete::Register(aset); << 79 G4AutoDelete::Register(aset); 76 CPU_ZERO(aset); << 80 CPU_ZERO(aset); 77 CPU_SET(cpu, aset); << 81 CPU_SET(cpu, aset); 78 pthread_t& _aT = (pthread_t&) (aT); << 82 pthread_t& _aT = (pthread_t&) (aT); 79 return (pthread_setaffinity_np(_aT, sizeof(c << 83 return (pthread_setaffinity_np(_aT, sizeof(cpu_set_t), aset) == 0); 80 } 84 } 81 # else // Not available for Mac, WIN,... << 85 #else //Not available for Mac, WIN,... 82 G4bool G4Threading::G4SetPinAffinity(G4int, G4 86 G4bool G4Threading::G4SetPinAffinity(G4int, G4NativeThread&) 83 { 87 { 84 G4Exception("G4Threading::G4SetPinAffinity() << 88 G4Exception("G4Threading::G4SetPinAffinity()", 85 "Affinity setting not available << 89 "NotImplemented", JustWarning, 86 "ignoring..."); << 90 "Affinity setting not available for this architecture, " 87 return true; << 91 "ignoring..."); >> 92 return true; 88 } 93 } 89 # endif << 94 #endif 90 95 91 void G4Threading::SetMultithreadedApplication( 96 void G4Threading::SetMultithreadedApplication(G4bool value) 92 { 97 { 93 isMTAppType = value; << 98 isMTAppType = value; 94 } 99 } 95 100 96 G4bool G4Threading::IsMultithreadedApplication << 101 G4bool G4Threading::IsMultithreadedApplication() 97 << 98 namespace << 99 { 102 { 100 std::atomic_int numActThreads(0); << 103 return isMTAppType; 101 } 104 } 102 G4int G4Threading::WorkerThreadLeavesPool() { << 105 103 G4int G4Threading::WorkerThreadJoinsPool() { r << 106 namespace 104 G4int G4Threading::GetNumberOfRunningWorkerThr << 105 { 107 { 106 return numActThreads.load(); << 108 std::atomic_int numActThreads(0); 107 } 109 } >> 110 int G4Threading::WorkerThreadLeavesPool() { return numActThreads--; } >> 111 int G4Threading::WorkerThreadJoinsPool() { return numActThreads++;} >> 112 G4int G4Threading::GetNumberOfRunningWorkerThreads() { return numActThreads.load(); } 108 113 109 #else // Sequential mode 114 #else // Sequential mode 110 115 111 G4Pid_t G4Threading::G4GetPidId() 116 G4Pid_t G4Threading::G4GetPidId() 112 { 117 { 113 // In sequential mode return Process ID and << 118 // In sequential mode return Process ID and not Thread ID 114 # if defined(WIN32) << 119 #if defined(WIN32) 115 return GetCurrentProcessId(); << 120 return GetCurrentProcessId(); 116 # else << 121 #else 117 return getpid(); << 122 return getpid(); 118 # endif << 123 #endif 119 } 124 } 120 125 121 G4int G4Threading::G4GetNumberOfCores() { retu 126 G4int G4Threading::G4GetNumberOfCores() { return 1; } 122 G4int G4Threading::G4GetThreadId() { return G4 127 G4int G4Threading::G4GetThreadId() { return G4Threading::SEQUENTIAL_ID; } 123 G4bool G4Threading::IsWorkerThread() { return 128 G4bool G4Threading::IsWorkerThread() { return false; } 124 G4bool G4Threading::IsMasterThread() { return 129 G4bool G4Threading::IsMasterThread() { return true; } 125 void G4Threading::G4SetThreadId(G4int) {} 130 void G4Threading::G4SetThreadId(G4int) {} 126 131 127 G4bool G4Threading::G4SetPinAffinity(G4int, G4 132 G4bool G4Threading::G4SetPinAffinity(G4int, G4NativeThread&) { return true; } 128 133 129 void G4Threading::SetMultithreadedApplication( 134 void G4Threading::SetMultithreadedApplication(G4bool) {} 130 G4bool G4Threading::IsMultithreadedApplication 135 G4bool G4Threading::IsMultithreadedApplication() { return false; } 131 G4int G4Threading::WorkerThreadLeavesPool() { << 136 int G4Threading::WorkerThreadLeavesPool() { return 0; } 132 G4int G4Threading::WorkerThreadJoinsPool() { r << 137 int G4Threading::WorkerThreadJoinsPool() { return 0; } 133 G4int G4Threading::GetNumberOfRunningWorkerThr 138 G4int G4Threading::GetNumberOfRunningWorkerThreads() { return 0; } 134 139 135 #endif 140 #endif 136 141