目录
- 生命游戏(Game of life)(OpenMP实现)
- 问题描述
- OpenMP代码实现
- 运行
- 参考资料
生命游戏(Game of life)(OpenMP实现)
问题描述
OpenMP代码实现
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <windows.h> //window环境下调用Sleep()函数包含此头文件
#define M 10 // 行数
#define N 10 // 列数
#define STEP 10 // 迭代次数
#define NUM_TH 4 // 线程数
int count_alive_neighbors(int* grid, int row, int col)
{
int count = 0;
// 检查相邻细胞的生死状态
for (int i = row - 1; i <= row + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < M && j >= 0 && j < N && !(i == row && j == col)) {
count += grid[i * N + j];
}
}
}
return count;
}
void update_grid(int* old_grid, int* new_grid)
{
#pragma omp parallel for collapse(2)
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
int alive_neighbors = count_alive_neighbors(old_grid, i, j);
if (old_grid[i * N + j]) {
// 活细胞的规则
if (alive_neighbors < 2 || alive_neighbors > 3) {
new_grid[i * N + j] = 0; // 死亡:孤独or拥挤
}
else {
new_grid[i * N + j] = 1; // 存活
}
}
else {
// 死细胞的规则
if (alive_neighbors == 3) {
new_grid[i * N + j] = 1; // 繁殖为活细胞
}
else {
new_grid[i * N + j] = 0; // 保持死亡
}
}
}
}
}
void print_grid(int* grid)
{
// 打印细胞状态矩阵
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", grid[i * N + j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
clock_t start = 0;
clock_t end = 0;
int* grid = (int*)malloc(M * N * sizeof(int));
int* new_grid = (int*)malloc(M * N * sizeof(int));
// 随机函数种子
//srand(time(NULL));
srand(9527);
// 初始化细胞状态,随机填充0和1
for (int i = 0; i < M * N; i++) {
grid[i] = rand() % 2;
}
int max_steps = STEP; // 最大迭代次数
omp_set_num_threads(NUM_TH); // 设置线程数量
// 打印初始矩阵
// printf("初始状态:\n");
// print_grid(grid);
start = clock();
for (int step = 0; step < max_steps; step++) {
update_grid(grid, new_grid);
// 打印每回合的矩阵
// printf("第 %d 回合:\n", step + 1);
//print_grid(new_grid);
// 将新的数组代替旧数组
int* temp = grid;
grid = new_grid;
new_grid = temp;
}
end = clock();
// 打印最终输出信息
// print_grid(new_grid);
printf("矩阵大小为:%d * %d\n迭代次数为:%d\n线程数为:%d\n", M, N, STEP, NUM_TH);
printf("总的CPU时间 = %f\n", (end - start) / (double)CLOCKS_PER_SEC);
free(grid);
free(new_grid);
return 0;
}
运行
win10 + vs2019