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