Question: Write a parallel program using OpenMP to accomplish the same as the following serial program. For the following serial program the user enters a line
Write a parallel program using OpenMP to accomplish the same as the following serial program. For the following serial program the user enters a line of text and the program outputs the number of occurrences of each character. For the parallel program if we have n threads we should divide the line into n segments (and not into n characters) and let each thread counts the characters of its segment
//File name: a.c
#include
#include
#include
#define ASCIIs 127 //ASCII characters from 0 to 127
#define atmost 1000
char letters[atmost + 1]; //Extra location for the string terminator '\0'
int total_count[ASCIIs];
void find(int count[], int start, int end);
int main()
{
int i, thread_count, n, start, end;
int count[ASCIIs], my_rank, segment, p;
printf("Enter a line not larger than 1000 characters. ");
fgets(letters, atmost,stdin);
printf("How many segments?: ");
scanf("%d", &thread_count);
//To make the length of the divisible by thread_count:
while(strlen(letters) % thread_count != 0) strcat(letters, " ");
n = strlen(letters);
for(i = 0; i < ASCIIs; i++)
total_count[i] = 0;
for(p = 0; p < thread_count; p++)
{
my_rank = p;
segment = n / thread_count;
start = my_rank * segment;
end = start + segment;
find(count, start, end);
for(i = 0; i <= ASCIIs; i++)
total_count[i] += count[i];
}
for(i = 33; i < ASCIIs; i++)
if(total_count[i] != 0)
printf("Number of %c is: %d ", i, total_count[i]);
return 0;
}
void find(int count[], int start, int end)
{
int i;
for(i = 0; i < ASCIIs; i++)
count[i] = 0;
for(i = start; i < end; i++)
count[(int)letters[i]]++;
}
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
