Sto installando nel framework uno strumento che genererà una tabella di dati binari. Ho un piano per rendere questo multithreaded per sfruttare appieno i 24 core a mia disposizione. (Sto stimando che il tempo sul muro per la generazione dei dati sarà di circa 50 giorni, in un singolo thread). L'ho fatto in passato usando il design server/client con la comunicazione socket in quanto avevo bisogno di distribuirlo su più macchine.È necessario il mutex per offset diversi nella memoria heap allocata
Questa volta, sto guardando un singolo approccio macchina/multi-thread e sto cercando di capire come farlo nel modo giusto.
Il thread principale gestirà l'assegnazione delle attività a ogni thread secondario e determinerà l'offset nella memoria allocata.
Ogni thread scrive in un intervallo di indirizzi univoco all'interno della memoria allocata. Poiché questi blocchi non si sovrappongono mai tra i record, non ci saranno mai due tentativi di scrivere lo stesso offset.
void computeRecord(void *taskInput)
{
struct TaskData *taskData = (TaskData *)(taskInput);
RecordData data;
// A huge long computation block to populate data
// (4-5 second run time)
long record_id = taskData->record_id;
char *buffer = taskData->start_buffer;
// mutex lock needed here ??
int n_bytes = sizeof(RecordData)
memcpy((char *)(buffer+record_id*n_bytes), (char *)(&recordData) n_bytes);
// mutex unlock here ?
}
configurazione Long. Breve domanda Il mutex è necessario in questo caso?
Non penso sia necessario, ma potrebbe essere alcune sottigliezze quindi non risponderò. –
Non vorrei che un compito di 50 giorni di calcolo vivesse interamente nella memoria. Quel livello di calcolo: i bit generati dovrebbero essere facili da salvare su disco senza danneggiare la larghezza di banda, il che consente di raccogliere facilmente esecuzioni parziali e separare il consumo dalla produzione. Per la tua domanda, tuttavia, non dovrebbe essere necessario alcun mutex se i tuoi offset sono ragionevolmente allineati sulla maggior parte delle architetture. – Yakk
Hai pensato di usare OpenMP: è esatto il tipo di parallelismo che è stato progettato per indirizzare lo – Christophe