// Schedule1.cpp : Defines the entry point for the console application.
//

// test der verschiedenen Verteilungen

#include "stdafx.h"

#include "math.h"  // sin
#include <windows.h>  // rand

#include <omp.h>


int main()  {
	const int MAX_THREAD=4;
	const int MAX_LOOP=20;
	int sum[MAX_THREAD];
	int tid;
	int i, N;

	N = MAX_LOOP;

	omp_set_num_threads(MAX_THREAD);

	for (int i=0; i<MAX_THREAD; i++) sum[i]=0;

	puts("Statisch");
	#pragma omp parallel for schedule(static,1)  private(i) 
	  for (i = 0; i < N; ++i)
		{
			tid = omp_get_thread_num();
			sum[tid]++;	
			//printf("ID: %d tid: %d\n", i, tid);
		}

	  for (int i=0; i<MAX_THREAD; i++) 
		 printf("ID: %d Summe: %d\n", i, sum[i]);
		// gleiche Verteilung fuer alle	
		// 01234 01234 01234 01234
	puts("\n\n");


	puts("Statisch mit Chunk = 5");
	for (int i=0; i<MAX_THREAD; i++) sum[i]=0;
	#pragma omp parallel for schedule(static,5)  private(i) 
	  for (i = 0; i < N; ++i)
		{
			tid = omp_get_thread_num();
			sum[tid]++;	
			//printf("ID: %d tid: %d\n", i, tid);
		}

	  for (int i=0; i<MAX_THREAD; i++) 
		 printf("ID: %d Summe: %d\n", i, sum[i]);
		// gleiche Verteilung fuer alle
	    // 0000 1111 2222 3333 4444
	puts("\n\n");


	puts("Dynamic mit Chunk = 1");
	for (int i=0; i<MAX_THREAD; i++) sum[i]=0;
	#pragma omp parallel for schedule(dynamic,1)  private(i) 
	  for (i = 0; i < N; ++i)
		{
			tid = omp_get_thread_num();
			sum[tid]++;	
			//printf("ID: %d tid: %d\n", i, tid);
		}

	  for (int i=0; i<MAX_THREAD; i++) 
		 printf("ID: %d Summe: %d\n", i, sum[i]);
		// gleiche Verteilung fuer alle
	puts("\n\n");


	puts("Dynamic mit Chunk = 5");
	for (int i=0; i<MAX_THREAD; i++) sum[i]=0;
	#pragma omp parallel for schedule(dynamic,5)  private(i) 
	  for (i = 0; i < N; ++i)
		{
			tid = omp_get_thread_num();
			sum[tid]++;	
			printf("ID: %d tid: %d\n", i, tid);
		}

	  for (int i=0; i<MAX_THREAD; i++) 
		 printf("ID: %d Summe: %d\n", i, sum[i]);
		// gleiche Verteilung fuer alle
		// 00000  11111 22222 33333
		// 01234  56789 ABCDE
	puts("\n\n");

	char ch[20];
	gets(ch);
	return 0;
}
