티스토리 뷰
#include <stdio.h>
#include <omp.h>
#include <stdlib.h>
#include <time.h>
#include "timers.h"
#define NDIM 1024
double a[NDIM][NDIM];
double b[NDIM][NDIM];
double c[NDIM][NDIM];
void matrix_multiply(double a[NDIM][NDIM], double b[NDIM][NDIM], double c[NDIM][NDIM], int num_threads)
{
int i;
omp_set_num_threads(num_threads);
#pragma omp parallel
{
int i,j,k;
int tid = omp_get_thread_num();
int from = (NDIM * tid) / num_threads;
int to = (NDIM * (tid + 1) ) / num_threads;
double sum = 0.0;
for( i = from ; i < to ; i++)
for(j = 0 ; j < NDIM ; j++)
{
sum = 0.0;
for(k = 0; k < NDIM ; k++)
{
sum += a[i][k] * b[k][j];
}
c[i][j] = sum;
}
}
}
void matrix_multiply_for(double a[NDIM][NDIM], double b[NDIM][NDIM], double c[NDIM][NDIM], int num_threads)
{
int i, j, k;
double sum = 0.0;
omp_set_num_threads(num_threads);
#pragma omp parallel
{
#pragma omp for private(i, j, k, sum)
for( i = 0 ; i < NDIM ; i++)
for(j = 0 ; j < NDIM ; j++)
{
sum = 0.0;
for(k = 0; k < NDIM ; k++)
{
sum += a[i][k] * b[k][j];
}
c[i][j] = sum;
}
}
}
void matrix_init(double a[NDIM][NDIM], double b[NDIM][NDIM])
{
int i, j;
srand(time(NULL));
for(i = 0; i < NDIM ; i++)
for(j = 0; j < NDIM ; j++)
{
a[i][j] = rand()%10 + 1;
b[i][j] = rand()%10 + 1;
}
}
void matrix_print(double x[NDIM][NDIM])
{
int i, j;
for(i = 0; i < NDIM ; i++)
{
for(j = 0; j < NDIM ; j++)
printf("%.2lf ",x[i][j]);
printf("\n");
}
}
int main(int argc, char** argv)
{
int num_threads = 0;
if(argc > 2)
{
num_threads = atoi(argv[1]);
} else {
num_threads = 2;
}
matrix_init(a, b);
timer_start(1);
matrix_multiply(a,b,c,num_threads);
timer_stop(1);
printf("Time using parallel : %lfsec\n",timer_read(1));
timer_start(2);
matrix_multiply_for(a,b,c,num_threads);
timer_stop(2);
printf("Time using parallel for : %lfsec\n", timer_read(2));
return 0;
}
' la fermata, 개발 > OpenMP' 카테고리의 다른 글
병렬 합 / shared, atomic, reduction 사용해보기 (0) | 2019.02.19 |
---|---|
shared, private 비교 (0) | 2019.02.19 |
스케쥴 사용하기 (static, dynamic, guided) (0) | 2019.02.19 |
Reduction 간단 예제 (0) | 2019.02.19 |
배열에서 가장 큰 값 찾기 pthread 포함 (0) | 2019.02.19 |