




已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
5題每題20分1. 1)簡述MPI 6個函數(shù)格式定義,作用,參數(shù)含義。MPI簡介:消息傳遞接口的標準,用于開發(fā)基于消息傳遞的并行程序,目的是為用戶提供一個實際可用的、可移植的、高效和靈活的消息傳遞接口庫,能夠在PC Windows和所有主要的Unix工作站以及并行機上實現(xiàn)。MPI是一個庫,不是一種語言,實現(xiàn)并行必須依托于某種語言:FORTRAN, MPI主要函數(shù):MPI_Init,初始化函數(shù):MPI程序通過調用MPI_Init函數(shù)進行MPI環(huán)境,并完成所有的初始化工作,這個函數(shù)通常是MPI程序的第一個函數(shù)調用。 格式如下: int MPI_Init( int *argc, char *argv )MPI_Finalize,結束函數(shù):MPI通過調用MPI_Finalize函數(shù)從MPI環(huán)境中退出,它是MPI程序的最后一個MPI函數(shù)調用,否則程序的執(zhí)行結果是不可預知的。 格式如下: int MPI_Finalize(void) ;MPI_Comm_rank,獲取進程的編號:MPI程序通過MPI_Comm_Rank函數(shù)調用獲取當前進程在指定通信域中的編號,有了該編號,不同的進程就可以將自身和其他進程區(qū)分開來,從而實現(xiàn)進程間的并行和合作。 格式如下:nt MPI_Comm_rank(MPI_Comm comm, int *rank)MPI_Comm_size,獲取指定通信域的進程數(shù):MPI通過調用MPI_Comm_size函數(shù)獲取指定通信域的進程個數(shù),進程可根據(jù)它來確定自己應該完成的任務比例。 格式如下:int MPI_Comm_size(MPI_Comm comm, int *size)MPI_Send消息發(fā)送函數(shù):MPI_Send函數(shù)用于發(fā)送一個消息到目標進程。其格式如下: int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm_comm)buf : 消息發(fā)送的起始地址count :發(fā)送消息的數(shù)量datatype: 發(fā)送數(shù)據(jù)的類型dest: 標識目標進程tag: 發(fā)送消息時打上的標簽comm: 通信類型MPI_Recv,消息接收:MPI_Recv函數(shù)用于從指定進程接收一個消息,格式如下:int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm, comm, MPI_Status *status )buf : 消息接收后存放地址count : 接收數(shù)量datatype : 接收數(shù)據(jù)類型source : 發(fā)送消息的進程tag : 消息的標簽comm : 通信類型status : 接收狀態(tài)1.2)舉例簡單的應用解釋如何通信。每個進程會屬于一個或多個通信域。一個簡單的例子/* simple.c */#include “mpi.h” /*MPI頭文件*/#include int main(argc, argv)int argc ;char *argv ; int rank, size, tag = 1 ; int senddata, recvdata ; MPI_Status status ; MPI_Init( &argc, &argv ) ; /*MPI的初始化*/ MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*該進程的編號 */ MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 總的進程數(shù)目*/if ( rank = 0 ) int senddata, recvdata ; MPI_Status status ; MPI_Init( &argc, &argv ) ; /*MPI的初始化*/ MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*該進程的編號 */ MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 總的進程數(shù)目*/ if ( rank = 0 ) senddata = 9999 ; MPI_Send( &senddata, 1, MPI_INT, 1, tag, MPI_COMM_WORLD ) ; /* 發(fā)送數(shù)據(jù)到進 程1 */ if ( rank = 1 ) MPI_Recv( &recvdata, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); /*從進程0接收數(shù)據(jù)*/ MPI_Finalize() ; /*MPI的結束函數(shù)*/ return (0) ;另一個例子實現(xiàn) sum( a + b ),并且把求和結果打印出來。這里 a, b 都是n維空間的向量,并且每個元素都為整數(shù)。#include “mpi.h” /*MPI頭文件*/#include #include int main(argc, argv)int argc ;char *argv ; int rank, size, i, tag = 1 ; int *a, *b, n; n = 100 ; a = (int*)malloc( sizeof( int ) * n ) ; b = (int*)malloc( sizeof( int ) * n ) ; for(i = 0 ; i n ; i+) ai = 1 ; bi = 2 ; MPI_Status status ; MPI_Init( &argc, &argv ) ; /*MPI的初始化*/ MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 總的進程數(shù)目*/ int nSize = n / size ; MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*該進程的編號 */ if( rank != (size - 1) ) int sum = 0 ; for( i = 0 ; i nSize ; i+ ) sum += ai + rank * nSize + b i + rank * nSize ; MPI_Send( &sum, 1, MPI_INT, (size-1), tag, MPI_COMM_WORLD ) ; /* 發(fā)送求和數(shù)據(jù)到進程(size-1) */else int sum = 0, total = 0 ; for( i = (size - 1) * nSize ; i n ; i+ ) sum += ai + bi ; total += sum ; for( i = 0 ; i (size - 1) ; i+ ) MPI_Recv( &sum, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status); /*從各個進程接收部分求和數(shù)據(jù)*/ total += sum ; printf( total = %dn, total ) ; MPI_Finalize() ; /*MPI的結束函數(shù)*/ return (0) ;2. 1)通過MPI如何實現(xiàn)2個矢量相加。/* simple.c */#include /*MPI頭文件*/#include #include int main(argc, argv)int argc ;char *argv ; int rank, size, tag = 1 ; int *a, *b , n = 100 ; a = (int*)malloc( sizeof( int ) * n ) ; b = (int*)malloc( sizeof( int ) * n ) ; int i ; for( i = 0 ; i n ; i+ ) ai = 1 ; bi = 2 ; MPI_Status status ; MPI_Init( &argc, &argv ) ; /*MPI的初始化*/ MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*該進程的編號 */ MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 總的進程數(shù)目*/ int nSize = n / size ; int sum ; if( rank (size -1) ) sum = 0 ; for( i = 0 ; i nSize ; i+ ) sum += ai + bi ; else sum = 0 ; for( i = nSize * (size - 1) ; i n ; i+ ) sum += ai + bi ; printf(cpu = %d, sum = %dn, rank, sum ) ; MPI_Finalize() ; /*MPI的結束函數(shù)*/ return (0) ;2.2)通過MPI如何實現(xiàn)2個矢量相乘。#include /*MPI頭文件*/#include #include int main(argc, argv)int argc ;char *argv ; int rank, size; int n = 100 ; int i ; MPI_Status status ; MPI_Init( &argc, &argv ) ; MPI_Comm_size( MPI_COMM_WORLD, &size ); int nSize = n / size ; MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; int *a, *b ; a = (int*)malloc( sizeof(int) * n ) ; b = (int*)malloc( sizeof(int) * n ) ; int( i = 0 ; i n ; i+ ) ai = 1 ; bi = 2 ; int tag = 1 ; if( rank != (size - 1) ) int sum = 0 ; for( i = 0 ; i nSize ; i+ ) sum += arank * nSize + i* brank * nSize + i; MPI_Send( &sum, 1, MPI_INT, (size-1), tag, MPI_COMM_WORLD ) ; else int sum = 0, total = 0 ; for( i = (size - 1) * nSize ; i n ; i+ ) sum += ai * bi; total += sum ; for( i = 0 ; i (size - 1) ; i+ ) MPI_Recv( &sum, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status); total += sum ; printf( total = %dn, total ) ; MPI_Finalize() ; /*MPI的結束函數(shù)*/ return (0) ; 3.1)n!如何用并行計算做(n給定)#include stdio.h#include stdlib.h#include math.h#include mpi.hint m,N;long jiech;int my_rank;int p;MPI_Status status;/* * 函數(shù)名: main * 輸入:argc為命令行參數(shù)個數(shù); * argv為每個命令行參數(shù)組成的字符串數(shù)組。 * 輸出:返回0代表程序正常結束 */int main(int argc, char *argv) int i,my_rank,group_size; long lji=1; MPI_Init(&argc,&argv); /* 啟動計算 */ MPI_Comm_size(MPI_COMM_WORLD,&group_size); /* 找進程數(shù) */ MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); /* 找自己的id */ p=group_size; if(my_rank=0) printf(Please input DATA:);scanf(%d,&N);MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD); /* 廣播size到所有進程*/ for(i=my_rank;iN;i=i+p) lji=lji*(i+1); /* 求各個處理器中l(wèi)ji積,并將最終結果存放在0進程的jiech中*/ MPI_Reduce(&lji,&jiech,1,MPI_INT,MPI_PROD,0,MPI_COMM_WORLD); if (my_rank=0) /* 打印結果*/ printf(N! =%d,jiech); printf(n); / printf(Whole running time = %f secondsn,time2-starttime); MPI_Barrier(MPI_COMM_WORLD); /* 同步所有進程 */ MPI_Finalize(); /* 結束計算 */ return (0);3.2) 1+2+3+.+n如何用并行計算做(n給定,例子中n=100)#include /*MPI頭文件*/#include #include int main(argc, argv)int argc ;char *argv ; int rank, size; int n = 100 ;int i ; MPI_Status status ; MPI_Init( &argc, &argv ) ; MPI_Comm_size( MPI_COMM_WORLD, &size ); int nSize = n / size ; MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; int tag = 1 ; if( rank != (size - 1) ) int sum = 0 ; for( i = 0 ; i nSize ; i+ ) sum += rank * nSize + i + 1; MPI_Send( &sum, 1, MPI_INT, (size-1), tag, MPI_COMM_WORLD ) ; elseint sum = 0, total = 0 ; for( i = (size - 1) * nSize ; i n ; i+ ) sum += i + 1; total += sum ; for( i = 0 ; i (size - 1) ; i+ ) MPI_Recv( &sum, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status); total += sum ; printf( total = %dn, total ) ; MPI_Finalize() ; /*MPI的結束函數(shù)*/ return (0) ; 4.1)不同的壓縮矩陣如何實現(xiàn)矩陣乘。4.2) 給你一個矩陣,讓你寫出三種格式中的一種存儲(寫出三種壓縮方式中的一種,矩陣和矢量乘你怎么做壓縮及如何存儲)16稀疏矩陣矢量乘(CSR)for(int i = 0 ; i n ; i+ ) int row_s = ptri ; int row_e = ptri+1 ; double sum = 0.0 ;for(int j = row_s ; j row_e ; j+)sum+=dataj*xindicesj; bi = sum ;稀疏矩陣矢量乘(DIA)for(int i = 0 ; i n ; i+)double sum = 0.0 ; for(int j = 0 ; j =0 & ncol n )double val = datai+j*n; sum += val * xncol ; bi = sum ;稀疏矩陣矢量乘(ELL)for(int i = 0 ; i n ; i+) double sum = 0.0 ;for(int j = 0 ; j cols; j+)double val = datai + j*n ; if( val != 0 )sum += val*xindicesi+j*n ; bi = sum ;#include /*MPI頭文件*/#include #include int main(argc, argv)int argc ;char *argv ; int rank, size; double *data ; int *indices, *ptr ; double *b, *x ; data = (double*)malloc( sizeof( double ) * SIZE * 5 ) ; indices = (int*)malloc( sizeof( int ) * SIZE * 5 ) ; ptr = (int*)malloc( sizeof( int ) * (SIZE + 1) ) ; x = (double*)malloc( sizeof( double ) * SIZE ) ; b = (double*)malloc( sizeof( double ) * SIZE ) ; csr_scalar_sparse_matrix_cpu(data, indices, ptr) ;int i, j, k ;for( k = 0 ; k SIZE ; k+ )xk = 1.0 ; int i ; MPI_Status status ; MPI_Init( &argc, &argv ) ; MPI_Comm_size( MPI_COMM_WORLD, &size ); int nSize = n / size ; MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; int tag = 1 ; if( rank != (size - 1) ) for( i = 0 ; i nSize ; i+ ) int r_start = ptri + nSize * rank ;int r_end = ptri + 1 + nSize * rank ;double sum = 0.0 for( j = r_start ; j r_end ; j+ ) sum += dataj * xindicesj ; bi + nSize * rank = sum ; MPI_Send(b+rank*nSize, nSize, MPI_DOUBLE, (size-1), tag, MPI_COMM_WORLD ) ; if( rank = (size -1 ) ) for( i = 0 ; i (size - 1) ; i+ ) MPI_Recv( b + i * nSize, nSize, MPI_DOUBLE, i, tag, MPI_COMM_WORLD, &status); double sum = 0.0 ; for( i = 0 ; i SIZE ; i+ ) sum += bi ; printf( sum = %lfn, sum ) ; MPI_Finalize() ; /*MPI的結束函數(shù)*/ return (0) ; 5)GPU,范式,平方和3、#include #include #include #include #define SIZE 1048576#define BLOCK_NUM 32#define THREAD_NUM 256_global_ void sumOfSquares_gpu0( float *a, int n, float *result )int tid = threadIdx.x ;int bid = blockIdx.x ;float sum = 0.0 ;for( int i = bid * THREAD_NUM + tid ; i n ; i += BLOCK_NUM * THREAD_NUM )sum += ai * ai ;resultbid * THREAD_NUM + tid = sum ;int main( int argc, char *argv )cudaEvent_t start, stop ;float elapsedTime ;float *result, *dev_result, *a, *dev_a ;cudaMalloc( (void*)&dev_result, BLOCK_NUM * THREAD_NUM * sizeof(float) ) ;cudaMalloc( (void*)&dev_a, SIZE * sizeof(float) ) ;a = (float*)malloc( SIZE * sizeof( float ) ) ;result = (float*)malloc( BLOCK_NUM * THREAD_NUM * sizeof( float ) ) ;for( int i = 0 ; i SIZE ; i+ )ai = 1.0 ;cudaMemcpy(dev_a, a, SIZE * sizeof(float), cudaMemcpyHostToDevice ) ;cudaEventCreate( &start ) ;cudaEventCreate( &stop ) ;cudaEventRecord( start, 0 ) ;sumOfSquares_gpu0( dev_a, SIZE, dev_result ) ;cudaMemcpy(result, dev_result, BLOCK_NUM * THREAD_NUM * sizeof(float), cudaMemcpyDeviceToHost ) ; double sum = 0.0 ; for(int i = 0 ; i BLOCK_NUM * THREAD_NUM ; i+ ) sum += resulti ; cudaEventRecord( stop, 0 ) ; cudaEventSynchronize( stop ) ; cudaEventElapsedTime( &elapsedTime, start, stop ) ; printf( TotalTime = : %20.12f ms n , elapsedTime ) ; printf( sum = : %20.12fn , sum ) ; cudaEventDestroy( start ) ; cudaEventDestroy( stop ) ; free( a ) ; cudaFree( dev_a ) ; cudaFree( dev_result ) ; return 0 ;2、#include #include #include #include #define SIZE 1048576#define BLOCK_NUM 32#define THREAD_NUM 256_global_ void sumOfSquares_gpu0( float *a, int n, float *result )_shared_ float sharedTHREAD_NUM;int tid = threadIdx.x ;int bid = blockIdx.x ;sharedtid = 0.0 ;for( int i = bid * THREAD_NUM + tid ; i n ; i += BLOCK_NUM * THREAD_NUM )sharedtid += ai * ai ; _syncthreads(); if(tid = 0) for(int i = 1; i THREAD_NUM; i+) shared0 += sharedi; resultbid = shared0; int main( int argc, char *argv )cudaEvent_t start, stop ;float elapsedTime ;float *result, *dev_result, *a, *dev_a ;cudaMalloc( (void*)&dev_result, BLOCK_NUM * sizeof(float) ) ;cudaMalloc( (void*)&dev_a, SIZE * sizeof(float) ) ;a = (float*)malloc( SIZE * sizeof( float ) ) ;result = (float*)malloc( BLOCK_NUM * sizeof( float ) ) ;for( int i = 0 ; i SIZE ; i+ )ai = 1.0 ;cudaMemcpy(dev_a, a, SIZE * sizeof(float), cudaMemcpyHostToDevice ) ;cudaEventCreate( &start ) ;cudaEventCreate( &stop ) ;cudaEventRecord( start, 0 ) ;sumOfSquares_gpu0( dev_a, SIZE, dev_result ) ;cudaMemcpy(result, dev_result, BLOCK_NUM * sizeof(float), cudaMemcpyDeviceToHost ) ; double sum = 0.0 ; for(int i = 0 ; i BLOCK_NUM ; i+ ) sum += resulti ; cudaEventRecord( stop, 0 ) ; cudaEventSynchronize( stop ) ; cudaEventElapsedTime( &elapsedTime, start, stop ) ; printf( TotalTime = : %20.12f ms n , elapsedTime ) ; printf( sum = : %20.12fn , sum ) ; cudaEventDestroy( start ) ; cudaEventDestroy( stop ) ; free( a ) ; cudaFree( dev_a ) ; cudaFree( dev_result ) ; return 0 ;1、#include #include #include #include #define SIZE 1048576#define THREAD_NUM 256_global_ void sumOfSquares_gpu0( float *a, int n, float *result )int tid = threadIdx.x ;float sum = 0.0 ;for( int i = tid ; i n ; i += THREAD_NUM )sum += ai * ai ;resulttid = sum ;int main( int argc, char *argv )cudaEvent_t start, stop ;float elapsedTime ;float *result, *dev_result, *a, *dev_a ;cudaMalloc( (void*)&dev_result, THREAD_NUM * sizeof(float) ) ;cudaMalloc( (void*)&dev_a, SIZE * sizeof(float) ) ;a = (float*)malloc( SIZE * sizeof( float ) ) ;result = (float*)malloc( THREAD_NUM * sizeof( float ) ) ;for( int i = 0 ; i SIZE ; i+ )ai = 1.0 ;cudaMemcpy(dev_a, a, SIZE * sizeof(float), cudaMemcpyHostToDevice ) ;cudaEventCreate( &start ) ;cudaEventCreate( &stop ) ;cudaEventRecord( start, 0 ) ;sumOfSquares_gpu0( dev_a, SIZE, dev_result ) ;cudaMemcpy(result, dev_result, THREAD_NUM * sizeof(float), cudaMemcpyDeviceToHost ) ; double sum = 0.0 ; for(int i = 0 ; i THREAD_NUM ; i+ ) sum += resulti ; cudaEventRecord( stop, 0 ) ; cudaEventSynchronize( stop ) ; cudaEventElapsedTime( &elapsedTime, start, stop ) ; printf( TotalTime = : %20.12f ms n , elapsedTime ) ; printf( sum = : %20.12fn , sum ) ; cudaEventDestroy( start ) ; cudaEventDestroy( stop ) ; free( a ) ; cudaFree( dev_a ) ; cudaFree( dev_result ) ; return 0 ;4、#include #include #include #include #define SIZE 1048576#define BLOCK_NUM 32#define THREAD_NUM 256_global_ void sumOfSquares_gpu0( float *a, int n, float *resul
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 染發(fā)考試題及答案
- 古漢考試題及答案
- 護理核心制度及安全試題與答案
- 護理人員崗位職責試題(含答案)
- 中西醫(yī)結合外科學(廣州中醫(yī)藥大學)知到智慧樹答案
- 黑龍江高級機修木工理論模擬試題(附答案)
- 2025二手設備買賣協(xié)議書附二手設備殘值回收條款
- 2025地產勞務合作勞務派遣服務合同
- 2025出租屋承包合同協(xié)議書-旅游度假區(qū)出租屋經營合同
- 盾構噪音控制方法-洞察及研究
- GB/T 1871.3-1995磷礦石和磷精礦中氧化鋁含量的測定容量法和分光光度法
- GA 1010-2012看守所床具
- 課程設計與評價
- 廣東省中山市20222022學年下學期期末考試八年級英語試卷
- 檢修案例-MR有載調壓開關的吊芯檢查全解課件
- 2023年國藥控股股份有限公司招聘筆試題庫及答案解析
- 現(xiàn)場處置方案現(xiàn)場應急處置方案(全套)
- 中國移動多功能廳多媒體系統(tǒng)方案
- 河道清淤施工方案(定稿)
- 石料場開采方案
- 2019三福百貨品牌介紹51P
評論
0/150
提交評論