So, I am encountering some difficulties when using openMp. I am new and I don’t know what I am doing wrong. This is a project for one of my courses at the university, so I'm not looking for a solution, but rather for a hint or explanation.
The project must calculate the distance from the interference between two lines that belong to different sets (say, setA and setB). These two sets can contain 100,1000 or 10,000 lines, each of which consists of the same character length.
My problem is that although I have reduced the execution time of the parallel program, it still takes more time than the sequential algorithm.
So, I am attaching my codes to show what I have done so far.
serial code C.
void main(int argc,char **argv)
{
int m=atoi(argv[1]),n=atoi(argv[2]),I=atoi(argv[3]);
int i=0,j=0,l=0,TotalHammingDistance=0,count;
char **setA = malloc(m * sizeof(char *));
for(i = 0; i < m; i++)
setA[i] = malloc((I+1) * sizeof(char));
char **setB = malloc(n * sizeof(char *));
for(i = 0; i < n; i++)
setB[i] = malloc((I+1) * sizeof(char));
for (i=0;i<m;i++){
for(j=0;j<I;j++){
setA[i][j]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 62];
}
setA[i][I]='\0';
}
for (i=0;i<n;i++){
for(j=0;j<I;j++){
setB[i][j]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 62];
}
setB[i][I]='\0';
}
int **HamDist = malloc(m * sizeof(int *));
for(i = 0; i < m; i++)
HamDist[i] = malloc(n * sizeof(int));
for(i=0;i<m;i++){
for(j=0;j<n;j++){
HamDist[i][j]=0;
}
}
clock_t start=clock();
for (i=0;i<m;i++){
for(j=0;j<n;j++){
count=0;
for(l=0;l<=I;l++) {
if (setA[i][l] != setB[j][l])
count++;
}
HamDist[i][j]=count;
TotalHammingDistance+=HamDist[i][j];
}
}
clock_t end =clock();
double hamm_time=(double)(end-start)/CLOCKS_PER_SEC;
printf("\n|Total Hamming execution time= %f",hamm_time);
printf("\n\n*|The Total Hamming Distance is: %d\n",TotalHammingDistance );
}
OpenMp C Code
void main(int argc,char **argv)
{
int m=atoi(argv[1]),n=atoi(argv[2]),I=atoi(argv[3]);
int i=0,j=0,TotalHammingDistance=0, tid,nthreads,chunk;
char **setA = malloc(m * sizeof(char *));
for(i = 0; i < m; i++)
setA[i] = malloc((I+1) * sizeof(char));
char **setB = malloc(n * sizeof(char *));
for(i = 0; i < n; i++)
setB[i] = malloc((I+1) * sizeof(char));
for (i=0;i<m;i++){
for(j=0;j<I;j++){
setA[i][j]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 62];
}
setA[i][I]='\0';
}
for (i=0;i<n;i++){
for(j=0;j<I;j++){
setB[i][j]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 62];
}
setB[i][I]='\0';
}
uint16_t **HamDist = malloc(m * sizeof(uint16_t *));
for(i = 0; i < m; i++)
HamDist[i] = malloc(n * sizeof(uint16_t));
for(i=0;i<m;i++){
for(j=0;j<n;j++){
HamDist[i][j]=0;
}
}
printf("\n HamDist set \n" );
int count=0;
clock_t start=clock();
omp_set_num_threads(2);
#pragma omp parallel shared(setA, setB,HamDist )
{
int k,p,l,count=0;
#pragma omp for schedule(dynamic, 10000)
for (k=0;k<m;k++){
for(p=0;p<n;p++){
count=0;
for(l=0;l<=I;l++){
if (setA[k][l] != setB[p][l]){
count++;
}
}
HamDist[k][p]=count;
}
}
}
clock_t end =clock();
double per_time=(double)(end-start)/CLOCKS_PER_SEC;
printf("\n|Total time for two sets= %f",per_time);
for (i=0;i<m;i++){
for(j=0;j<n;j++){
TotalHammingDistance+=HamDist[i][j];
}
}
printf("\n|Total execution time= %f",per_time);
printf("\n\n*|The Total Hamming Distance is: %d\n",TotalHammingDistance );
}
The execution time that I get is about 42.011104 for the openmp program and about 32.876482 for the sequential algorithm (m = n = 10000 and i = 100, where m, n describes the number of lines in each set, and I describes the length of the line)
I strongly believe that a parallel program should take less time to execute. Any idea?
Thanks in advance!