Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Eseguire un programma su un insieme specifico di processori in un sistema multiprocessore


Partiamo subito con la funzione e poi analizziamo i parametri

function ExecuteProcess(FileName: string; BitMask: Integer; Synch: Boolean ): Cardinal; var zAppName: array[0..512] of Char; zCurDir: array[0..255] of Char; WorkDir: string; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; Closed: Boolean; begin Closed := True; StrPCopy(zAppName, FileName); GetDir(0, WorkDir); StrPCopy(zCurDir, WorkDir); FillChar(StartupInfo, SizeOf(StartupInfo), #0); if not CreateProcess(nil, zAppName, // pointer to command line string nil, // pointer to process security attributes nil, // pointer to thread security attributes False, // handle inheritance flag CREATE_NEW_CONSOLE or // creation flags NORMAL_PRIORITY_CLASS, nil, //pointer to new environment block nil, // pointer to current directory name StartupInfo, // pointer to STARTUPINFO ProcessInfo) // pointer to PROCESS_INF then Result := WAIT_FAILED else begin //eseguire il processo sull' insieme di CPU specificato SetProcessAffinityMask(ProcessInfo.hProcess, BitMask); ///// if (Synch = True) then //se voglio una esecuzione Sincrona begin Closed:= False; repeat case WaitForSingleObject( ProcessInfo.hProcess, 100) of WAIT_OBJECT_0 : Closed:= True; WAIT_FAILED : RaiseLastWin32Error; end; Application.ProcessMessages; until (Closed); GetExitCodeProcess(ProcessInfo.hProcess, Result); //codice di uscita del processo attivatoexit code of the launched process //(0 se il processo in questione non ha restituito errori CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end else begin Result := 0; end; end; end; {ExecuteProcess}

  • FileName: nome dell'eseguibile
  • BitMask: specifica l' insieme di processori su cui voglio eseguire il programma e viene definita nella seguente maniera: ho una sequenza di bit e ogni bit corrisponde ad un processore (nell' ordine da destra a sinistra). Imposto un bit a 1 se voglio usare il processore corrispondente, 0 altrimenti. Ad esempio: ho 4 processori e voglio eseguire il processo specificato sui processori 2 e 4: la BitMask corrispondente sarÓ 1010 --> 2^0 * 0 + 2^1 * 1 + 2^2 * 0 + 2^3 * 1 = 2 + 8 = 10 e quindi BitMask = 10
  • Synch: True se voglio una esecuzione Sincrona (non posso chiudere la mia applicazione prima che il processo attivato sia terminato

A questo punto apri Taskmanager, seleziona il programma lanciato, click col destro, "Imposta affinitÓ" e vedrai la spunta in corrispondenza dei processori scelti per l' esecuzione (gli altri sono tutti deselezionati).

 

 

 
 
Your Ad Here