看板 Programming
作者 標題 求救【MPI】台大考古題
時間 2015-05-11 Mon. 19:52:52
老妹我因為畢業學分的關係,不得不把這門課拼過。
希望能有高手能夠教學或者開從哪邊下手?QAQ
修改講義中sat.c的程式, 完成下列工作: (執行程式時至少要使用兩台主機, eg: alpha和delta)
1. 使用MPI_Reduce函數, 計算所有process中, 可使得check_circuit的邏輯式子為1的input個數總和, 並將該總和列印出.
2. 使用MPI_Wtime函數, 計算執行sat.c程式所需的時間, 並將其列印出.
#include "mpi.h"
#include <stdio.h>
int main (int argc, char *argv[]) {
int i;
int id; /* Process rank */
int p; /* Number of processes */
void check_circuit (int, int);
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &id);
MPI_Comm_size (MPI_COMM_WORLD, &p);
for (i = id; i < 65536; i += p)
check_circuit (id, i);
printf ("Process %d is done\n", id);
fflush (stdout);
MPI_Finalize();
return 0;
}
/* Return 1 if 'i'th bit of 'n' is 1; 0 otherwise */
#define EXTRACT_BIT(n,i) ((n&(1<<i))?1:0)
void check_circuit (int id, int z) {
int v[16]; /* Each element is a bit of z */
int i;
for (i = 0; i < 16; i++) v[i] = EXTRACT_BIT(z,i);
if ((v[0] || v[1]) && (!v[1] || !v[3]) && (v[2] || v[3])
&& (!v[3] || !v[4]) && (v[4] || !v[5])
&& (v[5] || !v[6]) && (v[5] || v[6])
&& (v[6] || !v[15]) && (v[7] || !v[8])
&& (!v[7] || !v[13]) && (v[8] || v[9])
&& (v[8] || !v[9]) && (!v[9] || !v[10])
&& (v[9] || v[11]) && (v[10] || v[11])
&& (v[12] || v[13]) && (v[13] || !v[14])
&& (v[14] || v[15])) {
printf ("%d) %d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n", id,
v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],
v[10],v[11],v[12],v[13],v[14],v[15]);
fflush (stdout);
}
--
※ 作者: isu10003099a 時間: 2015-05-11 19:52:52
※ 看板: Programming 文章推薦值: 0 目前人氣: 0 累積人氣: 631
回列表(←)
分享