我做了生命游戏的顺序版本,但现在我需要使用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并列,但我不知道该怎么做。
答案 0 :(得分:4)
我认为外循环不能并行化,因为每一代的输入都是前一代,所以它有一个顺序公式(至少你不能做一些微小的变化!)
如果嵌套循环遍历矩阵或类似的东西,我更喜欢运行从0
到ncol*nrow
的单个循环(在您的情况下)并找到i
和{ {1}}来自循环索引。
j
我在笔记本电脑上使用双核2.53 GHz CPU在1000x1000矩阵上运行此代码超过1000代,并且速度提高了69%。