亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cannon.c

?? 高性能計算程序示例之四
?? C
字號:
#include <stdlib.h>
#include <string.h>
#include <mpi.h>
#include <time.h>
#include <stdio.h>
#include <math.h>

/* 全局變量聲明 */
float **A, **B, **C;              /* 總矩陣,C = A * B */
float *a, *b, *c, *tmp_a, *tmp_b; /* a、b、c表分塊,tmp_a、tmp_b表緩沖區 */
int dg, dl, dl2,p, sp;            /* dg:總矩陣維數;dl:矩陣塊維數;dl2=dl*dl;p:處理器個數;sp=sqrt(p) */
int my_rank, my_row, my_col;      /* my_rank:處理器ID;(my_row,my_col):處理器邏輯陣列坐標 */
MPI_Status status;

/*
 *函數名: get_index
 *功能:處理器邏輯陣列坐標至rank號的轉換
 *輸入:坐標、邏輯陣列維數
 *輸出:rank號
 */
int get_index(int row, int col, int sp)
{
   return ((row+sp)%sp)*sp + (col+sp)%sp;
}

/*
 *函數名:random_A_B
 *功能:隨機生成矩陣A和B
 */
void random_A_B()
{
   int i,j;

    srand((unsigned int)time(NULL));     /*設隨機數種子*/

	/*隨機生成A,B,并初始化C*/
    for(i=0; i<dg ; i++)
      for(j=0; j<dg ; j++)
	  {
	    A[i][j] = rand();
        B[i][j] = rand();
        C[i][j] = 0.0;
	  }
}

/* 函數名:scatter_A_B
 * 功能:rank為0的處理器向其他處理器發送A、B矩陣的相關塊
 */
void scatter_A_B()
{
   int i,j,k,l;
   int p_imin,p_imax,p_jmin,p_jmax;

   for(k=0; k<p; k++)

   {
	  /*計算相應處理器所分得的矩陣塊在總矩陣中的坐標范圍*/
	  p_jmin = (k % sp    ) * dl;
  	  p_jmax = (k % sp + 1) * dl-1;
	  p_imin = (k - (k % sp))/sp * dl;
	  p_imax = ((k - (k % sp))/sp +1) *dl -1;
      l = 0;

      /*rank=0的處理器將A,B中的相應塊拷至tmp_a,tmp_b,準備向其他處理器發送*/
      for(i=p_imin; i<=p_imax; i++)
      {
      	  for(j=p_jmin; j<=p_jmax; j++)
      	  {
              tmp_a[l] = A[i][j];
	      tmp_b[l] = B[i][j];
	      l++;
          }
      }

      /*rank=0的處理器直接將自己對應的矩陣塊從tmp_a,tmp_b拷至a,b*/
      if(k==0)
      {
         memcpy(a, tmp_a, dl2 * sizeof(float));
	 memcpy(b, tmp_b, dl2 * sizeof(float));
      } else   /*rank=0的處理器向其他處理器發送tmp_a,tmp_b中相關的矩陣塊*/
      {
          MPI_Send(tmp_a, dl2, MPI_FLOAT, k, 1, MPI_COMM_WORLD);
	  MPI_Send(tmp_b, dl2, MPI_FLOAT, k, 2, MPI_COMM_WORLD);
      }
   }
}

/*
 *函數名:init_alignment
 *功能:矩陣A和B初始對準
 */
void init_alignment()
{
   /*將A中坐標為(i,j)的分塊A(i,j)向左循環移動i步*/
   MPI_Sendrecv(a, dl2, MPI_FLOAT, get_index(my_row,my_col-my_row,sp), 1,
            tmp_a, dl2, MPI_FLOAT, get_index(my_row,my_col+my_row,sp), 1, MPI_COMM_WORLD, &status);
   memcpy(a, tmp_a, dl2 * sizeof(float) );

   /*將B中坐標為(i,j)的分塊B(i,j)向上循環移動j步*/
   MPI_Sendrecv(b, dl2, MPI_FLOAT, get_index(my_row-my_col,my_col,sp), 1,
            tmp_b, dl2, MPI_FLOAT, get_index(my_row+my_col,my_col,sp), 1, MPI_COMM_WORLD, &status);
   memcpy(b, tmp_b, dl2 * sizeof(float) );
}

/*
 *函數名:main_shift
 *功能:分塊矩陣左移和上移,并計算分塊c
 */
void main_shift()
{
   int i,j,k,l;

   for(l=0; l<sp; l++)
   {
     /*矩陣塊相乘,c+=a*b */
     for(i=0; i<dl; i++)
       for(j=0; j<dl; j++)
         for(k=0; k<dl; k++)
           c[i*dl+j] += a[i*dl+k]*b[k*dl+j];

      /* 將分塊a左移1位 */
      MPI_Send(a , dl2, MPI_FLOAT, get_index(my_row, my_col-1, sp), 1, MPI_COMM_WORLD);
      MPI_Recv(a , dl2, MPI_FLOAT, get_index(my_row, my_col+1, sp), 1, MPI_COMM_WORLD, &status);

      /* 將分塊b上移1位 */
      MPI_Send(b , dl2, MPI_FLOAT, get_index(my_row-1, my_col, sp), 1, MPI_COMM_WORLD);
      MPI_Recv(b , dl2, MPI_FLOAT, get_index(my_row+1, my_col, sp), 1, MPI_COMM_WORLD, &status);
   }
}

/*
 *函數名:collect_c
 *功能:rank為0的處理器從其余處理器收集分塊矩陣c
 */
void collect_C()
{
   int i,j,i2,j2,k;
   int p_imin,p_imax,p_jmin,p_jmax; /* 分塊矩陣在總矩陣中頂點邊界值 */

   /* 將rank為0的處理器中分塊矩陣c結果賦給總矩陣C對應位置 */
   for (i=0;i<dl;i++)
	 for(j=0;j<dl;j++)
	   C[i][j]=c[i*dl+j];

   for (k=1;k<p;k++)
   {
       /*將rank為0的處理器從其他處理器接收相應的分塊c*/
       MPI_Recv(c, dl2, MPI_FLOAT, k, 1, MPI_COMM_WORLD, &status);

       p_jmin = (k % sp    ) *dl;
       p_jmax = (k % sp + 1) *dl-1;
       p_imin =  (k - (k % sp))/sp     *dl;
       p_imax = ((k - (k % sp))/sp +1) *dl -1;

       i2=0;
       /*將接收到的c拷至C中的相應位置,從而構造出C*/
       for(i=p_imin; i<=p_imax; i++)
       {
           j2=0;
           for(j=p_jmin; j<=p_jmax; j++)
           {
               C[i][j]=c[i2*dl+j2];
               j2++;
           }
           i2++;
       }
   }
}

/*函數名:print
 *功能:打印矩陣
 *輸入:指向矩陣指針的指針,字符串
 */
void print(float **m,char *str)
{
   int i,j;
   printf("%s",str);
   /*打印矩陣m*/
   for(i=0;i<dg;i++)
   {
       for(j=0;j<dg;j++)
           printf("%15.0f    ",m[i][j]);
       printf("\n");
   }
   printf("\n");
}

/*
 *函數名:main
 *功能:主過程,Cannon算法,矩陣相乘
 *輸入:argc為命令行參數個數,argv為每個命令行參數組成的字符串數組
 */
int main(int argc, char *argv[])
{
   int i;

   MPI_Init(&argc, &argv);                  /* 啟動MPI計算 */
   MPI_Comm_size(MPI_COMM_WORLD, &p);       /* 確定處理器個數 */
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* 確定各自的處理器標識符 */

   sp = sqrt(p);

   /* 確保處理器個數是完全平方數,否則打印錯誤信息,程序退出 */
   if (sp*sp != p)
   {
      if (my_rank == 0)
	  printf("Number of processors is not a quadratic number!\n");
      MPI_Finalize();
      exit(1);
   }

   if (argc != 2)
   {
      if (my_rank == 0)
          printf("usage: mpirun -np ProcNum cannon MatrixDimension\n");
      MPI_Finalize();
      exit(1);
   }

   dg  = atoi(argv[1]);    /* 總矩陣維數 */
   dl  = dg / sp;          /* 計算分塊矩陣維數 */
   dl2 = dl * dl;

   /* 計算處理器在邏輯陣列中的坐標 */
   my_col =  my_rank % sp ;
   my_row = (my_rank-my_col) / sp ;

   /* 為a、b、c分配空間 */
   a = (float *)malloc( dl2 * sizeof(float) );
   b = (float *)malloc( dl2 * sizeof(float) );
   c = (float *)malloc( dl2 * sizeof(float) );

   /* 初始化c */
   for(i=0; i<dl2 ; i++)
     c[i] = 0.0;

   /* 為tmp_a、tmp_b分配空間 */
   tmp_a = (float *)malloc( dl2 * sizeof(float) );
   tmp_b = (float *)malloc( dl2 * sizeof(float) );

   if (my_rank == 0)
   {
      /* rank為0的處理器為A、B、C分配空間 */
      A = (float **)malloc( dg * sizeof(float*) );
      B = (float **)malloc( dg * sizeof(float*) );
      C = (float **)malloc( dg * sizeof(float*) );

      for(i=0; i<dg; i++)
      {
         A[i] = (float *)malloc( dg * sizeof(float) );
         B[i] = (float *)malloc( dg * sizeof(float) );
         C[i] = (float *)malloc( dg * sizeof(float) );
      }
      random_A_B();     /* rank為0的處理器隨機化生成A、B矩陣 */
      scatter_A_B();    /* rank為0的處理器向其他處理器發送A、B矩陣的相關塊 */
   } else               /* rank不為0的處理器接收來自rank為0的處理器的相應矩陣分塊 */
   {
       MPI_Recv(a, dl2, MPI_FLOAT, 0 , 1, MPI_COMM_WORLD, &status);
       MPI_Recv(b, dl2, MPI_FLOAT, 0 , 2, MPI_COMM_WORLD, &status);
   }

   init_alignment();    /* A、B矩陣的初始對準 */

   main_shift();        /* 分塊矩陣左移、上移, cannon算法的主過程 */

   if(my_rank == 0)
   {
     collect_C();       /* rank為0的處理器從其余處理器收集分塊矩陣c */
     print(A,"random matrix A : \n");  /* 打印矩陣A */
	 print(B,"random matrix B : \n");  /* 打印矩陣B */
	 print(C,"Matrix C = A * B : \n");     /* 打印矩陣C */

   } else
   {
      MPI_Send(c,dl2,MPI_FLOAT,0,1,MPI_COMM_WORLD); /* rank不為0的處理器向rank為0的處理器發送矩陣塊c */
   }

   MPI_Barrier(MPI_COMM_WORLD);        /* 同步所有處理器 */
   MPI_Finalize();                     /* 結束MPI計算 */

   return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久午夜免费电影| 欧美激情一区不卡| 中文字幕成人av| 亚洲一区二区成人在线观看| 久久精品国产一区二区三区免费看| 久久国产生活片100| 欧洲中文字幕精品| 日韩一二在线观看| 美日韩一级片在线观看| 91久久精品一区二区三| 国产日韩欧美综合在线| 国产乱码精品一区二区三区av| 中文字幕电影一区| 国内精品久久久久影院色| 欧美一区二区三区四区视频| 一区二区三区欧美日| 91老师片黄在线观看| 国产精品久久精品日日| 高清国产一区二区| 国产精品欧美一级免费| 福利视频网站一区二区三区| 精品国产乱码久久久久久浪潮| 美女脱光内衣内裤视频久久网站 | 综合久久一区二区三区| 波多野结衣欧美| 中文字幕精品一区| 国产成人精品免费看| 久久精品视频在线免费观看 | 91精品国产美女浴室洗澡无遮挡| 亚洲123区在线观看| 欧美精品欧美精品系列| 精品一区二区影视| 国产婷婷一区二区| 91免费观看国产| 性欧美疯狂xxxxbbbb| 日韩女同互慰一区二区| 韩国中文字幕2020精品| 亚洲精品成人精品456| 蜜桃精品在线观看| 国产日韩欧美麻豆| 色诱视频网站一区| 日韩专区在线视频| 欧美成人一区二区三区片免费 | 成人国产免费视频| 亚洲成国产人片在线观看| 精品成人a区在线观看| 91免费在线看| 国产精品自拍网站| 午夜激情综合网| 国产精品色在线观看| 欧美一区二区三区视频| 成人精品在线视频观看| 日韩国产高清影视| 亚洲欧美激情在线| 国产欧美视频一区二区| 欧美亚洲国产一区在线观看网站 | 91免费在线播放| 激情综合色丁香一区二区| 亚洲男人电影天堂| 国产日本欧美一区二区| 日韩欧美一卡二卡| 欧美高清一级片在线| 91免费在线看| 99久久精品情趣| 国产成人在线视频网站| eeuss鲁片一区二区三区在线观看| 国产日产欧美一区二区视频| 欧美男人的天堂一二区| 99re视频精品| 99国产一区二区三精品乱码| 岛国av在线一区| 国产成人小视频| 国产不卡免费视频| 欧美日韩免费视频| 久久综合色综合88| 亚洲猫色日本管| 蜜臀av一级做a爰片久久| 国产一区二区在线视频| 91成人在线观看喷潮| 在线综合+亚洲+欧美中文字幕| 日韩欧美一级二级| 国产性天天综合网| 亚洲午夜日本在线观看| 欧美日韩三级视频| 人人狠狠综合久久亚洲| 91香蕉视频污| 国内久久精品视频| 黑人巨大精品欧美黑白配亚洲| 国产乱子轮精品视频| 国产白丝网站精品污在线入口| 国产iv一区二区三区| aaa欧美大片| 在线播放中文字幕一区| 精品少妇一区二区三区免费观看| 久久久久综合网| 国产精品日韩成人| 亚洲国产成人91porn| 久久99精品久久久久久动态图| 国产成人免费视频网站高清观看视频 | 激情久久五月天| 国产经典欧美精品| 欧美午夜精品一区| 欧美精品一区二区在线播放| 亚洲视频狠狠干| 国产在线视频一区二区| 91在线无精精品入口| 欧美一区二区三区电影| 国产精品麻豆一区二区| 天涯成人国产亚洲精品一区av| 国产成人综合网| 欧美电影在线免费观看| 欧美激情艳妇裸体舞| 五月天网站亚洲| 91网站在线观看视频| 久久久一区二区三区| 日韩高清在线一区| 欧洲另类一二三四区| 国产精品久久久久久久蜜臀| 日本va欧美va精品发布| 在线视频你懂得一区二区三区| 精品国产伦一区二区三区观看方式 | 久久久亚洲午夜电影| 日韩精品五月天| 欧美在线三级电影| 国产午夜精品理论片a级大结局 | 亚洲色欲色欲www| 国产成人欧美日韩在线电影| 欧美大片顶级少妇| 蜜芽一区二区三区| 日韩一级免费一区| 蜜臀av性久久久久av蜜臀妖精 | 国产丝袜欧美中文另类| 九九精品一区二区| 精品国产制服丝袜高跟| 久久99精品国产麻豆婷婷洗澡| 日韩欧美123| 韩国女主播一区| 久久九九久精品国产免费直播| 国产一区二区0| 国产精品少妇自拍| 91蝌蚪国产九色| 亚洲444eee在线观看| 欧美精选一区二区| 青青草国产精品97视觉盛宴| 欧美成人免费网站| 国产露脸91国语对白| 亚洲日本在线天堂| 在线中文字幕一区| 日本91福利区| 久久精品欧美日韩精品| 成人午夜又粗又硬又大| 亚洲黄色片在线观看| 欧美日韩免费高清一区色橹橹| 青青草精品视频| 国产精品久久久久7777按摩| 欧美在线啊v一区| 精品一区二区三区久久久| 国产精品久久久久四虎| 欧美日韩亚洲综合| 国产成人免费视频| 伊人一区二区三区| 精品sm在线观看| 欧美视频一区在线观看| 91香蕉视频污在线| 伊人色综合久久天天人手人婷| 欧美性大战久久久| 免费日本视频一区| 国产亚洲精品aa午夜观看| 91黄色激情网站| 国内外成人在线| 亚洲18色成人| 国产亚洲综合av| 欧美最猛黑人xxxxx猛交| 国产在线不卡视频| 视频一区免费在线观看| 1024国产精品| 国产亚洲一本大道中文在线| 制服丝袜成人动漫| 在线观看区一区二| caoporen国产精品视频| 久久97超碰国产精品超碰| 午夜电影网一区| 亚洲一二三专区| 亚洲免费观看高清在线观看| 中文字幕精品在线不卡| 国产精品五月天| 国产视频一区二区在线| xfplay精品久久| 亚洲精品在线三区| 欧美sm美女调教| 国产亚洲欧美激情| 精品区一区二区| 2020国产成人综合网| 亚洲精品一区二区三区蜜桃下载| 欧美一区二区日韩一区二区| 91精品免费在线观看| 日韩欧美第一区| 久久久亚洲午夜电影| 国产精品久久久久9999吃药| 亚洲欧洲精品一区二区三区不卡|