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 26 // G4Threading implementation 27 // 27 // 28 // Author: Andrea Dotti, 15 February 2013 - Fi 28 // Author: Andrea Dotti, 15 February 2013 - First Implementation 29 // Revision: Jonathan R. Madsen, 21 February 2 29 // Revision: Jonathan R. Madsen, 21 February 2018 30 // ------------------------------------------- 30 // -------------------------------------------------------------------- 31 31 32 #include "G4Threading.hh" 32 #include "G4Threading.hh" 33 #include "G4AutoDelete.hh" 33 #include "G4AutoDelete.hh" 34 #include "G4AutoLock.hh" 34 #include "G4AutoLock.hh" 35 #include "globals.hh" 35 #include "globals.hh" 36 36 37 #if defined(_WIN32) << 37 #if defined(WIN32) 38 # include <windows.h> << 38 # include <Windows.h> 39 #else 39 #else 40 # include <sys/syscall.h> 40 # include <sys/syscall.h> 41 # include <sys/types.h> 41 # include <sys/types.h> 42 # include <unistd.h> 42 # include <unistd.h> 43 #endif 43 #endif 44 44 45 #if defined(G4MULTITHREADED) 45 #if defined(G4MULTITHREADED) 46 46 47 # include <atomic> 47 # include <atomic> 48 48 49 namespace 49 namespace 50 { 50 { 51 G4ThreadLocal G4int G4ThreadID = G4Threading 51 G4ThreadLocal G4int G4ThreadID = G4Threading::MASTER_ID; 52 G4bool isMTAppType = false; 52 G4bool isMTAppType = false; 53 } // namespace 53 } // namespace 54 54 55 G4Pid_t G4Threading::G4GetPidId() 55 G4Pid_t G4Threading::G4GetPidId() 56 { 56 { 57 // In multithreaded mode return Thread ID 57 // In multithreaded mode return Thread ID 58 return std::this_thread::get_id(); 58 return std::this_thread::get_id(); 59 } 59 } 60 60 61 G4int G4Threading::G4GetNumberOfCores() 61 G4int G4Threading::G4GetNumberOfCores() 62 { 62 { 63 return std::thread::hardware_concurrency(); 63 return std::thread::hardware_concurrency(); 64 } 64 } 65 65 66 void G4Threading::G4SetThreadId(G4int value) { 66 void G4Threading::G4SetThreadId(G4int value) { G4ThreadID = value; } 67 G4int G4Threading::G4GetThreadId() { return G4 67 G4int G4Threading::G4GetThreadId() { return G4ThreadID; } 68 G4bool G4Threading::IsWorkerThread() { return 68 G4bool G4Threading::IsWorkerThread() { return (G4ThreadID >= 0); } 69 G4bool G4Threading::IsMasterThread() { return 69 G4bool G4Threading::IsMasterThread() { return (G4ThreadID == MASTER_ID); } 70 70 71 # if defined(__linux__) || defined(_AIX) 71 # if defined(__linux__) || defined(_AIX) 72 G4bool G4Threading::G4SetPinAffinity(G4int cpu 72 G4bool G4Threading::G4SetPinAffinity(G4int cpu, G4NativeThread& aT) 73 { 73 { 74 cpu_set_t* aset = new cpu_set_t; 74 cpu_set_t* aset = new cpu_set_t; 75 G4AutoDelete::Register(aset); 75 G4AutoDelete::Register(aset); 76 CPU_ZERO(aset); 76 CPU_ZERO(aset); 77 CPU_SET(cpu, aset); 77 CPU_SET(cpu, aset); 78 pthread_t& _aT = (pthread_t&) (aT); 78 pthread_t& _aT = (pthread_t&) (aT); 79 return (pthread_setaffinity_np(_aT, sizeof(c 79 return (pthread_setaffinity_np(_aT, sizeof(cpu_set_t), aset) == 0); 80 } 80 } 81 # else // Not available for Mac, WIN,... 81 # else // Not available for Mac, WIN,... 82 G4bool G4Threading::G4SetPinAffinity(G4int, G4 82 G4bool G4Threading::G4SetPinAffinity(G4int, G4NativeThread&) 83 { 83 { 84 G4Exception("G4Threading::G4SetPinAffinity() 84 G4Exception("G4Threading::G4SetPinAffinity()", "NotImplemented", JustWarning, 85 "Affinity setting not available 85 "Affinity setting not available for this architecture, " 86 "ignoring..."); 86 "ignoring..."); 87 return true; 87 return true; 88 } 88 } 89 # endif 89 # endif 90 90 91 void G4Threading::SetMultithreadedApplication( 91 void G4Threading::SetMultithreadedApplication(G4bool value) 92 { 92 { 93 isMTAppType = value; 93 isMTAppType = value; 94 } 94 } 95 95 96 G4bool G4Threading::IsMultithreadedApplication 96 G4bool G4Threading::IsMultithreadedApplication() { return isMTAppType; } 97 97 98 namespace 98 namespace 99 { 99 { 100 std::atomic_int numActThreads(0); 100 std::atomic_int numActThreads(0); 101 } 101 } 102 G4int G4Threading::WorkerThreadLeavesPool() { 102 G4int G4Threading::WorkerThreadLeavesPool() { return --numActThreads; } 103 G4int G4Threading::WorkerThreadJoinsPool() { r 103 G4int G4Threading::WorkerThreadJoinsPool() { return ++numActThreads; } 104 G4int G4Threading::GetNumberOfRunningWorkerThr 104 G4int G4Threading::GetNumberOfRunningWorkerThreads() 105 { 105 { 106 return numActThreads.load(); 106 return numActThreads.load(); 107 } 107 } 108 108 109 #else // Sequential mode 109 #else // Sequential mode 110 110 111 G4Pid_t G4Threading::G4GetPidId() 111 G4Pid_t G4Threading::G4GetPidId() 112 { 112 { 113 // In sequential mode return Process ID and 113 // In sequential mode return Process ID and not Thread ID 114 # if defined(WIN32) 114 # if defined(WIN32) 115 return GetCurrentProcessId(); 115 return GetCurrentProcessId(); 116 # else 116 # else 117 return getpid(); 117 return getpid(); 118 # endif 118 # endif 119 } 119 } 120 120 121 G4int G4Threading::G4GetNumberOfCores() { retu 121 G4int G4Threading::G4GetNumberOfCores() { return 1; } 122 G4int G4Threading::G4GetThreadId() { return G4 122 G4int G4Threading::G4GetThreadId() { return G4Threading::SEQUENTIAL_ID; } 123 G4bool G4Threading::IsWorkerThread() { return 123 G4bool G4Threading::IsWorkerThread() { return false; } 124 G4bool G4Threading::IsMasterThread() { return 124 G4bool G4Threading::IsMasterThread() { return true; } 125 void G4Threading::G4SetThreadId(G4int) {} 125 void G4Threading::G4SetThreadId(G4int) {} 126 126 127 G4bool G4Threading::G4SetPinAffinity(G4int, G4 127 G4bool G4Threading::G4SetPinAffinity(G4int, G4NativeThread&) { return true; } 128 128 129 void G4Threading::SetMultithreadedApplication( 129 void G4Threading::SetMultithreadedApplication(G4bool) {} 130 G4bool G4Threading::IsMultithreadedApplication 130 G4bool G4Threading::IsMultithreadedApplication() { return false; } 131 G4int G4Threading::WorkerThreadLeavesPool() { 131 G4int G4Threading::WorkerThreadLeavesPool() { return 0; } 132 G4int G4Threading::WorkerThreadJoinsPool() { r 132 G4int G4Threading::WorkerThreadJoinsPool() { return 0; } 133 G4int G4Threading::GetNumberOfRunningWorkerThr 133 G4int G4Threading::GetNumberOfRunningWorkerThreads() { return 0; } 134 134 135 #endif 135 #endif 136 136