OpenMP的生命游戏

时间:2012-12-12 18:44:59

标签: c optimization openmp conways-game-of-life

我做了生命游戏的顺序版本,但现在我需要使用OpenMP制作我的代码的并行版本,但我遇到了一些问题。 如果有人能帮助我,那将是非常好的。 THKS。 这是我的顺序代码:

// Swapping the two grids   
 #define SWAP_BOARDS( b1, b2 )  do { \
 char* temp = b1; \
 b1 = b2; \
 b2 = temp; \
 } while(0)

// Simplifying access to grid elements
   #define BOARD( G, X, Y )  ((G)[NC*(X)+(Y)])

 char* sequential_game_of_life (char* outgrid, char* ingrid, 
       const int nrows, const int ncols, const int gens_max) {

  const int NC = ncols;
  int curgen, i, j;

 for (curgen = 0; curgen < gens_max; curgen++)
   {

  for (i = 0; i < nrows; i++)
{
  for (j = 0; j < ncols; j++)
    {
      const int inorth = mod (i-1, nrows);
      const int isouth = mod (i+1, nrows);
      const int jwest = mod (j-1, ncols);
      const int jeast = mod (j+1, ncols);

      const char neighbor_count = 
    BOARD (ingrid, inorth, jwest) + 
    BOARD (ingrid, inorth, j) + 
    BOARD (ingrid, inorth, jeast) + 
    BOARD (ingrid, i, jwest) +
    BOARD (ingrid, i, jeast) + 
    BOARD (ingrid, isouth, jwest) +
    BOARD (ingrid, isouth, j) + 
    BOARD (ingrid, isouth, jeast);

      BOARD(outgrid, i, j) = alivep (neighbor_count, BOARD (ingrid, i, j));
    }
}
  SWAP_BOARDS( outgrid, ingrid );
}
  return outgrid;
 }

我知道我必须与那些3并列,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:4)

我认为外循环不能并行化,因为每一代的输入都是前一代,所以它有一个顺序公式(至少你不能做一些微小的变化!)

如果嵌套循环遍历矩阵或类似的东西,我更喜欢运行从0ncol*nrow的单个循环(在您的情况下)并找到i和{ {1}}来自循环索引。

像这样:

j

我在笔记本电脑上使用双核2.53 GHz CPU在1000x1000矩阵上运行此代码超过1000代,并且速度提高了69%。