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:
codice:
#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);
}
}
Vi ringrazio per l'eventuale aiuto