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

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

?? cannon.c

?? 該源碼使用MPI并行語言實現Cannon數值算法,在Linux下測試實現.需要配置多節點分布環境
?? 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一区二区三区免费野_久草精品视频
国产精品资源在线观看| 国产在线看一区| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美欧美午夜aⅴ在线观看| 蜜桃一区二区三区在线观看| 亚洲精品在线观看视频| 欧亚洲嫩模精品一区三区| 国产电影精品久久禁18| 久久精品噜噜噜成人av农村| 亚洲欧美视频在线观看视频| 久久亚区不卡日本| 91精品国产综合久久蜜臀| 91蝌蚪porny| 成人av资源在线观看| 国产一区二区在线观看视频| 日韩精品91亚洲二区在线观看 | 一区二区三区小说| 久久精品一区二区三区不卡牛牛| 欧美三级日韩三级国产三级| 99国产精品久| 成人午夜电影久久影院| 精品写真视频在线观看| 蜜臀久久99精品久久久久宅男 | 国产suv一区二区三区88区| 免费在线成人网| 午夜视频久久久久久| 亚洲一区二区视频在线观看| 最近中文字幕一区二区三区| 国产欧美精品日韩区二区麻豆天美| 日韩欧美一区电影| 日韩欧美在线影院| 69精品人人人人| 在线不卡中文字幕| 欧美精品久久一区| 欧美日韩大陆在线| 欧美一级视频精品观看| 日韩一区二区三区免费观看| 51久久夜色精品国产麻豆| 在线成人午夜影院| 日韩午夜激情av| 欧美成人福利视频| 久久婷婷久久一区二区三区| 欧美精品一区二区高清在线观看| 精品久久人人做人人爰| 久久综合久久99| 久久久三级国产网站| 国产三级三级三级精品8ⅰ区| 欧美精品一区二区三区高清aⅴ| 日韩欧美一级特黄在线播放| 欧美videos大乳护士334| 精品国产乱码久久久久久免费| 日韩精品一区二区三区视频播放 | 91亚洲资源网| 色乱码一区二区三区88| 欧美性大战久久久久久久蜜臀| 欧美视频一区在线| 欧美一级艳片视频免费观看| 精品国产91洋老外米糕| 中文字幕 久热精品 视频在线| 亚洲欧美怡红院| 亚洲国产sm捆绑调教视频| 日本亚洲三级在线| 国产一区二区三区在线看麻豆| 国产不卡高清在线观看视频| 色综合久久综合| 9191久久久久久久久久久| 日韩欧美电影一区| 国产精品青草综合久久久久99| 亚洲精品乱码久久久久| 天天免费综合色| 国产福利不卡视频| 在线免费观看日本一区| 日韩欧美国产午夜精品| 国产精品九色蝌蚪自拍| 亚洲电影一区二区| 国产在线视频不卡二| 色婷婷综合久久久久中文| 91精品国产高清一区二区三区| 久久久久9999亚洲精品| 亚洲最色的网站| 国产自产2019最新不卡| 色综合久久久久综合99| 欧美精品日韩精品| 国产日韩欧美综合一区| 亚洲高清不卡在线观看| 国产精品一区二区你懂的| 91免费版在线| 精品国产一区二区三区久久影院| 亚洲欧洲99久久| 久久国产精品99久久久久久老狼| 99re这里只有精品视频首页| 日韩一级片网站| 亚洲欧洲综合另类| 国内外成人在线| 欧美日韩中文一区| 国产精品国产三级国产aⅴ无密码| 日韩福利视频导航| 色综合天天综合网国产成人综合天 | 久久久久久久久岛国免费| 一区二区三区精品在线观看| 国产在线乱码一区二区三区| 欧美日韩国产电影| 亚洲三级视频在线观看| 国产中文字幕精品| 日韩一级免费一区| 午夜影视日本亚洲欧洲精品| eeuss鲁片一区二区三区在线看| 91精品免费观看| 亚洲精品久久久久久国产精华液| 国产成人在线看| 精品少妇一区二区| 人人精品人人爱| 精品视频1区2区| 1024精品合集| 成人综合激情网| 国产亚洲精品bt天堂精选| 麻豆91免费观看| 欧美一区二区三区影视| 肉色丝袜一区二区| 精品视频一区二区不卡| 曰韩精品一区二区| 91丨国产丨九色丨pron| 日本一区二区动态图| 国产乱码精品一区二区三区忘忧草| 91精品在线免费观看| 亚洲电影第三页| 欧美精品丝袜久久久中文字幕| 一区二区三区四区在线| 一本大道久久a久久精品综合 | 日韩不卡免费视频| 在线不卡的av| 日本欧美在线观看| 欧美一区二区三区视频免费| 午夜一区二区三区视频| 欧美嫩在线观看| 日韩制服丝袜av| 日韩亚洲欧美综合| 麻豆精品一区二区av白丝在线| 欧美一区二区私人影院日本| 奇米影视在线99精品| 日韩无一区二区| 久久99久久久欧美国产| 久久久亚洲午夜电影| 国产白丝网站精品污在线入口| 国产拍欧美日韩视频二区| 日本sm残虐另类| 欧美一区二区精美| 亚洲电影你懂得| 欧美三级韩国三级日本一级| 亚洲精品欧美在线| 日本韩国一区二区三区| 亚洲综合一二区| 欧美一区二区三区在线观看| 日本va欧美va精品发布| 2024国产精品视频| 国产99久久久国产精品潘金网站| 欧美激情综合五月色丁香| 99国产精品一区| 午夜精品久久久久久不卡8050| 日韩一级黄色大片| 国产福利91精品| 亚洲精品中文在线| 制服丝袜av成人在线看| 精品一区二区三区在线观看| 国产欧美一区二区精品性色| 色婷婷久久综合| 日韩avvvv在线播放| 色综合久久久久久久久久久| 日韩国产欧美视频| 欧美国产一区二区| 欧美精品在线视频| 国产乱人伦偷精品视频免下载| 国产精品久久久久久妇女6080 | 成人免费va视频| 亚洲精品老司机| 久久综合色鬼综合色| 色www精品视频在线观看| 日本vs亚洲vs韩国一区三区| 国产精品人成在线观看免费| 欧美日韩你懂得| 国产成人免费av在线| 午夜久久电影网| 国产精品女同一区二区三区| 欧美日韩一级大片网址| 国产成人精品免费视频网站| 亚洲线精品一区二区三区| 久久久综合视频| 欧美精品三级日韩久久| 成人高清av在线| 麻豆专区一区二区三区四区五区| 亚洲色图欧洲色图| 精品国产区一区| 在线观看网站黄不卡| 国产高清亚洲一区| 首页亚洲欧美制服丝腿| 综合久久一区二区三区| 精品免费视频一区二区| 欧美亚洲综合色| www.99精品| 国产精品影视天天线|