freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

并行程序設(shè)計(jì)hppt課件(參考版)

2025-01-17 16:27本頁面
  

【正文】 return 0。 pragma omp parallel num_threads(2) { printf(thread %d in process %d\n, omp_get_thread_num(), myid )。 MPI_Comm_rank( MPI_COMM_WORLD, amp。 MPI_Comm_size( MPI_COMM_WORLD, amp。argc, amp。 組和通信子 ? 組和通信子都可在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建和刪除 ? 一個(gè)進(jìn)程可以同時(shí)屬于多個(gè)組 /通信子,其在各自的組 /通信子內(nèi)擁有唯一的 rank 0 1234567891011M PI _ COM M _ WORLD0 1234567891011group 2group 10 ( 0 )1 ( 1 )2 ( 2 ) 3 ( 3 )4 ( 4 )5 ( 5 )Co mm 16 ( 0 )7 ( 1 )9 ( 3 )8 ( 2 )11 ( 5 )10 ( 4 )Co mm 2分組通信示例 注意:一個(gè)進(jìn)程在不同組 /通信子內(nèi)的 rank不相等 MPI與多線程 MPI與多線程 ? MPI進(jìn)程中可以執(zhí)行多個(gè)線程,同一個(gè)進(jìn)程的多個(gè)線程具有均等的機(jī)會(huì)參與該進(jìn)程的 MPI通信 ? 應(yīng)用程序自身負(fù)責(zé)維護(hù)多線程安全 – 例如:為避免線程的 MPI通信相互干擾,可以讓不同的線程使用不同的通信子 ? MPI并不提供多線程編程接口 – 可以與 pthread或 OpenMP配合編程 ? MPI要求 MPI_Init()和 MPI_Finalize()必須在相同線程內(nèi)配對(duì)執(zhí)行,執(zhí)行這兩個(gè)操作的線程稱為主線程 (main thread) – 必須在所有線程的 MPI調(diào)用結(jié)束后,主線程才可以執(zhí)行MPI_Finalize() ? 同一進(jìn)程內(nèi),不允許兩個(gè)線程同時(shí)等待一個(gè) MPI調(diào)用完成 – 需由程序的線程間同步 /互斥機(jī)制保證 MPI與多線程 MPI+OpenMP混合編程簡(jiǎn)單示例 include include include int main(int argc,char **argv) { int numProcs, myid。 /* 在新通信子范圍內(nèi)廣播隨機(jī)數(shù) */ MPI_Bcast( amp。newComm )。newGroup )。globalGroup )。 MPI_Comm rowComm[numCols]。 函數(shù)名稱 功 能 通信子的創(chuàng)建與取消 MPI_Comm_create() 利用進(jìn)程組創(chuàng)建新的通信子 MPI_Comm_dup() 復(fù)制通信子 MPI_Comm_split() 將通信子關(guān)聯(lián)的進(jìn)程組分為兩個(gè)子組 MPI_Comm_free() 將通信子標(biāo)記為無效 訪問信息 MPI_Comm_size() 返回通信子關(guān)聯(lián)的進(jìn)程組中進(jìn)程個(gè)數(shù) MPI_Comm_rank() 返回調(diào)用進(jìn)程在進(jìn)程組中編號(hào) MPI_Comm_pare() 比較兩個(gè)通信子并返回結(jié)果 組和通信子 三、通信子管理 創(chuàng)建新組和通信子代碼示例 int ranks[4][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } }。 集合通信 七、進(jìn)程間同步 ? MPI_Barrier()將阻塞進(jìn)程,直到組內(nèi)進(jìn)程都到達(dá)該點(diǎn) MPI_Barrier():組內(nèi)進(jìn)程同步 int MPI_Barrier( MPI_Comm m //通信子 )。 /* 各進(jìn)程將計(jì)算結(jié)果放入 result */ result = … /* 進(jìn)程 2作為根進(jìn)程從各進(jìn)程收集 result放入 recvbuf */ MPI_Gather( amp。 /* 各進(jìn)程使用 value作為參數(shù),進(jìn)行計(jì)算 */ … … 在“統(tǒng)計(jì) 3的個(gè)數(shù)”例子中,可以用 MPI_Scatter()分發(fā)數(shù)據(jù) 六、數(shù)據(jù)收集 ? MPI_Gather()是 MPI_Scatter()的逆操作 ? 根進(jìn)程從組內(nèi)所有進(jìn)程收集數(shù)據(jù),依次放入自己的接收緩沖區(qū) MPI_Gather():從通信子中所有進(jìn)程收集數(shù)據(jù),放置到根進(jìn)程中 int MPI_Gather( void *sendbuffer, //欲發(fā)送數(shù)據(jù)的地址 int sendcount, //欲發(fā)送數(shù)據(jù)個(gè)數(shù) MPI_Datatype sendtype, //欲發(fā)送數(shù)據(jù)類型 void *recvbuffer, //欲接收數(shù)據(jù)的地址 int recvcount, //欲接收數(shù)據(jù)個(gè)數(shù) MPI_Datatype recvtype, //欲接收數(shù)據(jù)類型 int root, //根進(jìn)程編號(hào) MPI_Comm m //通信子 )。 } /* 進(jìn)程 2作為根進(jìn)程將數(shù)據(jù)分發(fā)給各個(gè)進(jìn)程 */ MPI_Scatter( sendbuf, 1, MPI_INT, amp。 i++ ) /* 進(jìn)程 2負(fù)責(zé)數(shù)據(jù)初始化 (或數(shù)據(jù)讀取 ) */ scanf( “%d”, amp。 if ( rank == 2 ) { for ( i = 0。 } 注: MPI_Wtime()用于 獲取當(dāng)前 MPI墻鐘時(shí)間 (wall clock time),常用于統(tǒng)計(jì)程序執(zhí)行時(shí)間 五、數(shù)據(jù)分發(fā) ? MPI_Scatter()從根進(jìn)程分發(fā)數(shù)據(jù)到組內(nèi)所有進(jìn)程 MPI_Scatter():從根進(jìn)程分發(fā)數(shù)據(jù)到通信子中所有進(jìn)程,包括根進(jìn)程自身 int MPI_Scatter( void *sendbuffer, //欲發(fā)送數(shù)據(jù)的地址 int sendcount, //欲發(fā)送數(shù)據(jù)個(gè)數(shù) MPI_Datatype sendtype, //欲發(fā)送數(shù)據(jù)類型 void *destbuffer, //欲接收數(shù)據(jù)的地址 int destcount, //欲接收數(shù)據(jù)個(gè)數(shù) MPI_Datatype desttype, //欲接收數(shù)據(jù)類型 int root, //根進(jìn)程編號(hào) MPI_Comm m //通信子 )。 } MPI_Finalize()。 printf(wall clock time = %f\n, endwtimestartwtime)。 if (myid == 0) { endwtime = MPI_Wtime()。mypi, amp。 } mypi = h * sum。 i += numprocs) { x = h * ((double)i )。 for (i = myid + 1。 h = / (double) n。 /* 從進(jìn)程 0向其他進(jìn)程分發(fā)數(shù)據(jù) */ MPI_Bcast(amp。 n = 10000。 fprintf(stdout,Process %d of %d is on %s\n, myid, numprocs, processor_name)。 MPI_Get_processor_name(processor_name,amp。 MPI_Comm_rank(MPI_COMM_WORLD,amp。 MPI_Comm_size(MPI_COMM_WORLD,amp。argc,amp。 char processor_name[MPI_MAX_PROCESSOR_NAME]。 double startwtime = , endwtime。 double PI25DT = 。 /* 各進(jìn)程使用 value作為參數(shù),進(jìn)行計(jì)算 */ … … CPI程序 : 計(jì)算圓周率 PI include include include double f(double a) { return ( / ( + a*a))。 } MPI_Bcast( amp。 進(jìn) 程 0 進(jìn) 程 1 進(jìn) 程 21 0 0進(jìn) 程 3廣 播 前消 息緩 沖 區(qū)進(jìn) 程 01 0 0進(jìn) 程 11 0 0進(jìn) 程 21 0 0進(jìn) 程 31 0 0廣 播 后if ( rank == 2 ) { /* 進(jìn)程 2讀取用戶輸入,廣播給其他進(jìn)程 */ scanf( “%d”, amp。 /* 執(zhí)行“加”掃描操作 */ MPI_Scan( sendbuf, recvbuf, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD )。 int recvbuf[1]。 }/*main()*/ 集合通信 三、掃描 (scan) ? 相當(dāng)于逐級(jí)規(guī)約 – 進(jìn)程 i對(duì)進(jìn)程 0, 1, …, i 執(zhí)行規(guī)約 MPI_Scan():掃描操作 int MPI_Scan( void *sendbuffer, //欲發(fā)送數(shù)據(jù)的地址 void *recvbuffer, //欲接收數(shù)據(jù)的地址 int count, //欲接收數(shù)據(jù)個(gè)數(shù) MPI_Datatype datatype, //數(shù)據(jù)類型 MPI_OP op, //MPI操作符 MPI_Comm m //通信子 )。 MPI_Finalize()。globalCount, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD )。 }/*for*/ /* 使用 “加 ”規(guī)約操
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1