Kafedrasi kompyuter arxitekturasi moduli bo‘yicha



Yüklə 0,86 Mb.
səhifə75/80
tarix25.12.2023
ölçüsü0,86 Mb.
#195585
1   ...   72   73   74   75   76   77   78   79   80
komp arx umk (6)

Namuna dasturlari
Keling, OpenMP texnologiyasi yordamida yozilgan parallel dastur misolini ko'rib chiqaylik. Shuni esda tutingki, ba'zi kompilyatorlarning sozlamalarida OpenMP-ni qo'llab-quvvatlash sukut bo'yicha o'chirilgan bo'lishi mumkin. Bunday holda, dasturni kompilyatsiya qilishda siz OpenMP dan foydalanish uchun kalitni aniq ko'rsatishingiz kerak. Masalan, matritsalarni ko'paytirish. Vazifani ikkita ipga quyidagicha taqsimlaymiz: yakuniy matritsaning qatorlarini yarmiga bo'ling va har bir ip o'zi "mas'ul" bo'lgan qatorlardagi hujayralarning qiymatlarini topadi.
#include
#include
#include
#include
/*
*/
void MatrixMul_GetNthRow
(
double aMatrixA[], double aMatrixB[], double
aMatrixC[],
unsigned M, unsigned N, unsigned K, unsigned idxRow
)
{
for(unsigned iCell= 0; iCelldouble cell= 0;
for(unsigned i= 0; icell+= aMatrixA[idxRow*N + i] * aMatrixB[K*i + iCell];
aMatrixC[idxRow*K + iCell]= cell;
}
}
/*
Процедура перемножает матрицы aMatrixA*aMatrixB согласованных
размеров M*N*K Результат помещается в матрицу aMatrixC
*/
void MatrixMul(double aMatrixA[], double aMatrixB[], double
aMatrixC[], unsigned M, unsigned N, unsigned K)
{
#pragma omp parallel for num_threads(2)
/*
Этой прагмой инициализируем параллельную часть цикла Каждая итерация цикла будет выполнена в одном из 2х созданных потоков Распределение итераций по потокам будет выполнено статически
*/
for(int iRow=0; iRow{
printf("%dth row is counting by %dth thread\n", iRow,
omp_get_thread_num());
MatrixMul_GetNthRow(aMatrixA, aMatrixB, aMatrixC, M, N,
K, iRow);
}
}
/*
*/
void InitMatrix(double aMatrix[], unsigned ItemsCount)
{
for(unsigned i= ItemsCount; i--; )
aMatrix[i]= (int)(100 * rand()/(double)RAND_MAX);
}
void OutMatrix(double aMatrix[], unsigned M, unsigned N)
{
for(unsigned i=0; i{
for(unsigned j=0; jprintf("%lf\t", aMatrix[i*N + j]);
putchar('\n');
}
putchar('\n');
}
#define M 3
#define N 3
#define K 4
void main(void)
{
double* MatrixA= new double [M*N];
double* MatrixB= new double [N*K];
double* MatrixC= new double [M*K];
InitMatrix(MatrixA, M*N);
InitMatrix(MatrixB, N*K);
MatrixMul(MatrixA, MatrixB, MatrixC, M, N, K);
OutMatrix(MatrixA, M, N);
OutMatrix(MatrixB, N, K);
OutMatrix(MatrixC, M, K);
delete []MatrixA;
delete []MatrixB;
delete []MatrixC;
getchar();
}
#undef M
#undef N
#undef K

Yüklə 0,86 Mb.

Dostları ilə paylaş:
1   ...   72   73   74   75   76   77   78   79   80




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin