Purtroppo mi ritrovo a dover dare un esame universitario di cui ho seguito il corso circa un anno fa. Ho iniziato riguardando i primi esempi che avevamo fatto in laboratorio e mi sono ritrovato con un programma sul False Sharing (che, per dover di cronaca, mostra il degradamento delle performance dovuto alla necessità di mantenere il contenuto delle cache coerente fra i diversi core quando questi modificano la stessa locazione di memoria).
Il problema è questo: considerando che come ambiente di sviluppo utilizzo MS Visual Studio 2010, non ricordo se per lanciare il programma basta avviare il debug o serve qualche comando particolare da prompt. Se scelgo la prima opzione, non viene creata la "regione parallela" (con l'apposita direttiva) e quindi non vengono lanciati thread in parallelo dal master thread.
Il codice è il seguente, e ho la certezza che sia corretto perchè l'anno scorso non avevo avuto problemi di questo genere:
Vi ringrazio per l'eventuale aiutocodice:#include <stdio.h> #include <stdlib.h> #include <omp.h> #include <iostream> // NON è un header! #include <array> // Libreria array #define VSIZE 1024 void slowUpdate(int nprocs); void fastUpdate(int nprocs); using namespace std; // Usiamo lo spazio standard dei nomi riferiti alle classi della libreria iostream array<int, VSIZE-1> arr; int main() { int num_procs = omp_get_num_procs(); double startTime; startTime = omp_get_wtime(); slowUpdate(num_procs); printf("Tempo impiegato con False Sharing: %lf s\n", omp_get_wtime() - startTime); startTime = omp_get_wtime(); fastUpdate(num_procs); printf("Tempo impiegato senza False Sharing: %lf s\n", omp_get_wtime() - startTime); system("pause"); return 0; } void slowUpdate(int nprocs) { int num_threads = omp_get_num_threads(); int threadID; int steps; int count = 0; #pragma omp parallel private(threadID, steps, count) num_threads(num_threads) { threadID = omp_get_thread_num(); steps = VSIZE - threadID; for (int i = 0; i < 1000000; i++) { for (int j = 0; j < steps; j += nprocs) { // ++count; arr[j + threadID] = 7; } } printf("Il thread #%d ha avuto un numero di interazioni pari a %d\n", threadID, count); } } void fastUpdate(int nprocs) { int num_threads = omp_get_num_threads(); int threadID; int steps = VSIZE / num_threads; int startFrom; int inc = 1; int count; #pragma omp parallel private(threadID, startFrom, count) num_threads(num_threads) { count = 0; threadID = omp_get_thread_num(); startFrom = steps * threadID; for (int i = 0; i < 1000000; i++) { for (int j = 0; j < steps; j += nprocs) { // ++count; arr[j + startFrom] = 7; } } printf("Il thread #%d ha avuto un numero di interazioni pari a %d\n", threadID, count); } }![]()

Rispondi quotando