finished MPI Histogram
This commit is contained in:
98
Histogram/main.cpp
Normal file
98
Histogram/main.cpp
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
============================================================================
|
||||
Name : Program2B.c
|
||||
Author : Joshua Chong
|
||||
Version : Part B
|
||||
Description : Calculate histogram program parallelized with pthreads.
|
||||
============================================================================
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <float.h>
|
||||
#include <time.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#define NUMBINS 1000
|
||||
#define NUM_THREADS 4
|
||||
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
int *histogramVals; /*global histogram array for all threads*/
|
||||
float binSize; /*bin size calculated from min and max of array values*/
|
||||
int numDataPoints;
|
||||
float rawData[1000000];
|
||||
int cnt = 1000000;
|
||||
int resultCode;
|
||||
float maxVal;
|
||||
float minVal;
|
||||
|
||||
void* calcHistogram (void* arg);
|
||||
|
||||
int main(void) {
|
||||
clock_t begin = clock();
|
||||
histogramVals = static_cast<int *>(malloc(NUMBINS * sizeof(int)));
|
||||
|
||||
FILE *fileIn = fopen("numbers.bin", "rb");
|
||||
resultCode = fread(rawData, sizeof(rawData[0]), sizeof(rawData)/sizeof(rawData[0]), fileIn);
|
||||
maxVal = FLT_MIN;
|
||||
minVal = FLT_MAX;
|
||||
for(int cnt1 = 0; cnt1 < cnt; cnt1++ ) {
|
||||
if ( rawData[cnt1] > maxVal )
|
||||
maxVal = rawData[cnt1];
|
||||
if ( rawData[cnt1] < minVal )
|
||||
minVal = rawData[cnt1];
|
||||
}
|
||||
binSize = (maxVal-minVal)/(float)NUMBINS;
|
||||
|
||||
if (fileIn == NULL){
|
||||
printf("File not opened\n");
|
||||
return 0;
|
||||
}
|
||||
printf("minVal: %f maxVal: %f binSize: %f\n", minVal, maxVal, binSize);
|
||||
fclose(fileIn);
|
||||
|
||||
pthread_t thread[NUM_THREADS];
|
||||
int index;
|
||||
for (index = 0; index < NUM_THREADS; index++) {
|
||||
//creating threads
|
||||
pthread_create(&thread[index], NULL, calcHistogram, &rawData[index * (cnt/NUM_THREADS)]);
|
||||
}
|
||||
for (index = 0; index < NUM_THREADS; index++) {
|
||||
// block until thread 'index' completes
|
||||
pthread_join(thread[index], NULL);
|
||||
}
|
||||
for (int cnt1 = 0; cnt1 < NUMBINS; cnt1++){
|
||||
//printf("bin: %d binStart: %f binEnd: %f Histogram Value: %d\n", cnt1, binSize*(float)cnt1, binSize*(float)(cnt1+1), histogramVals[cnt1]);
|
||||
}
|
||||
|
||||
/* Calculating the time the program takes to run */
|
||||
clock_t end = clock();
|
||||
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
|
||||
printf("Time in seconds: %f", time_spent);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
* Function: calcHistogram
|
||||
* Purpose: Calculate Histogram result is in a global variable histogramVals.
|
||||
* In args: arg: changed to one parameter in order to fit pthread_create
|
||||
* arg is the starting points of each thread. Example: 0, 250000, 500000,
|
||||
* 1000000.
|
||||
* Outputs: Histogram of values stored in global histogramVals
|
||||
binSize in global variable.
|
||||
*
|
||||
*/
|
||||
|
||||
void* calcHistogram (void* arg) {
|
||||
float* data = (float*)arg;
|
||||
for (int i = 0; i < cnt/NUM_THREADS ; i++){
|
||||
int binNum = (int)((data[i] - minVal) / binSize);
|
||||
pthread_mutex_lock(&mutex);
|
||||
histogramVals[binNum]++;
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user