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