顯示廣告
隱藏 ✕
看板 Programming
作者 isu10003099a (大寶兒)
標題 求救【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 
1樓 時間: 2015-05-14 16:29:58 (台灣)
+1 05-14 16:29 TW
別擔心 老師幫你集氣~
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇