生命游戏(Game of life)(OpenMP实现)

目录

  • 生命游戏(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

参考资料

[1] OpenMP和MPI环境配置
[2]
[3]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/419478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机提示msvcp110.dll丢失修复方法,轻松搞定DLL问题

当计算机系统中msvcp110.dll文件发生丢失时&#xff0c;可能会引发一系列运行问题和功能障碍&#xff0c;影响到用户的正常使用体验。这个动态链接库文件是Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;对于许多基于Windows操作系统的应用程序来说&am…

网络安全学习笔记1

1.了解kali及安装 vmware安装&#xff0c;用户名密码均为kali 2.metasploit是什么 3.metasploit攻击windows系统 在kali中打来终端 数据msfconsole 进入metasploit的控制终端界面 msf的使用法则&#xff1a; 1.使用模块 2.配置模块必选项 3.运行模块 三步操作、实现对…

structuredClone() 详解

您是否知道&#xff0c;现在 JavaScript 中有一种原生的方式可以深拷贝对象&#xff1f; 没错&#xff0c;这个内置于 JavaScript 运行时的structuredClone函数就是这样&#xff1a; const calendarEvent {title: "Builder.io大会",date: new Date(123),attendees…

buuctf_misc_九连环

题目&#xff1a;&#xff08;一张123456cry.jpg&#xff09; 这个先直接上kali&#xff0c;图片已改名cry.jpg 在上一篇&#xff0c;我留存了kali文件夹下有"叉"打不开的问题&#xff0c;经查阅&#xff0c;已解决&#xff1a; http://t.csdnimg.cn/bgv4T 输入&a…

抖音视频批量下载工具|视频评论采集软件

我们团队自主研发的视频批量下载软件为您提供了一种全新的视频获取体验。通过这款工具&#xff0c;您可以轻松地根据特定关键词搜索视频内容&#xff0c;实现批量和有选择性的提取&#xff0c;让您更便捷地获取符合需求的视频内容。 操作简要说明如下&#xff1a; 1. 关键词搜…

灰度负载均衡和普通负载均衡有什么区别

灰度负载均衡&#xff08;Gray Load Balancing&#xff09;与普通负载均衡的主要区别在于它们服务发布和流量管理的方式。 灰度负载均衡 目的&#xff1a;主要用于灰度发布&#xff0c;即逐步向用户发布新版本的服务&#xff0c;以减少新版本可能带来的风险。工作方式&#x…

基于springboot实现在线考试系统项目【项目源码+论文说明】

基于springboot实现在线考试系统演示 摘要 时代在变化&#xff0c;科技技术以无法预测的速度在达到新的高度&#xff0c;并且被应用于社会生活的各个领域&#xff0c;随着生活的加快&#xff0c;也使很多潜在的点逐渐突显出来&#xff0c;社会对于人才的要总是非常迫切的&…

【论文阅读】《PRODIGY: Enabling In-context Learning Over Graphs》

文章目录 0、基本介绍1、研究动机2、创新点3、挑战4、准备4.1、图上分类任务4.2、少样本提示4.3、提示图表示4.3.1、Data graph G D \mathcal{G}^D GD4.3.2、task graph G T \mathcal{G}^T GT 5、方法论5.1、提示图上的信息传播架构5.1.1、Data graph Message Passing5.1.2、…

【学习笔记】数据结构与算法05:树、层序遍历、深度优先搜索、二叉搜索树

知识出处&#xff1a;Hello算法&#xff1a;https://www.hello-algo.com/ 文章目录 2.4 树2.4.1 「二叉树 binary tree」2.4.1.1 二叉树基本操作2.4.1.2 二叉树的常见类型「完美二叉树 perfect binary tree」「完全二叉树 complete binary tree」「完满二叉树 full binary tre…

OJ_重建二叉树

题干 已知&#xff1a;二叉树的先序序列和中序序列求&#xff1a;后序序列 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };TreeNode* Rebuil…

国科大计算机网络实验 HTTP服务器

UCAS_CN_LAB HTTP服务器实验 实验要求 •实现&#xff1a;使用C语言实现最简单的HTTP服务器 •同时支持HTTP&#xff08;80端口&#xff09;和HTTPS&#xff08;443端口&#xff09; •使用两个线程分别监听各自端口 •只需支持GET方法&#xff0c;解析请求报文&#xff…

数字IC基础:数字集成电路书籍推荐

相关阅读 数字IC基础https://blog.csdn.net/weixin_45791458/category_12365795.html?spm1001.2014.3001.5482 目录 Verilog HDL 《Verilog HDL数字设计与综合(本科教学版)》 (美)萨米尔帕尔尼卡 《Verilog高级数字系统设计技术与实例分析》(美)基肖尔米什拉 《Verilog编…

终结数据混乱!开发者必学的GraphQL秘籍,高效API只需一步

在数字世界中&#xff0c;API就如同城市中的道路&#xff0c;连接着各种服务和数据。然而&#xff0c;传统的API&#xff08;如RESTful&#xff09;虽然功不可没&#xff0c;但随着技术复杂性和需求多样性不断攀升&#xff0c;它们显露出的局限性也呼唤着新的可能出现。此时&am…

四川尚熠电子商务有限公司电商服务领域的佼佼者

在数字化浪潮席卷全球的今天&#xff0c;电子商务已成为推动企业转型升级、拓展市场渠道的重要力量。四川尚熠电子商务有限公司&#xff0c;作为一家专注于抖音电商服务的公司&#xff0c;凭借其独特的服务模式和创新的营销策略&#xff0c;在激烈的市场竞争中脱颖而出&#xf…

Android 获取USB相机支持的分辨率有多少

直接上代码 private fun getCamera() {// 获取系统相机服务val cameraManager requireContext().getSystemService(Context.CAMERA_SERVICE) as? CameraManagerif (cameraManager ! null) {// 在这里进行相机管理器的操作// 获取相机设备的 ID&#xff08;这里假设使用第一个相…

C++:类与对象(1)

创作不易&#xff0c;谢谢支持&#xff01; 一、面向过程和面向对象 1、C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 如我们要实现洗衣服&#xff1a; 2、而C是基于面向对象的&#xff0c;关注的是…

【EI会议征稿通知】第三届仿真设计与计算建模国际学术会议(SDCM 2024)

The 3rd International Conference on Simulation Design and Computational Modeling 第三届仿真设计与计算建模国际学术会议&#xff08;SDCM 2024&#xff09; 第三届仿真设计与计算建模国际会议&#xff08;SDCM 2024&#xff09;将于 4 月 26-28 日在中国重庆召开。第二届…

理解python3中的回调函数

百度百科说&#xff1a;回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该函数的实现方直接调用&#…

PCIE 4.0 Power Mangement

PCIe总线的电源管理包含了ASPM和软件电源管理两方面的内容&#xff0c;所谓ASPM是指PCIe路在没有系统软件参与的情况下&#xff0c;由PCIe链路自发进行的电源管理方式&#xff1b;而软件电源管理是指PCI-PM机制&#xff08;与PCI总线兼容&#xff09;。 1. Link State Power M…

Python爬虫——Urllib库-1

这几天都在为了蓝桥杯做准备&#xff0c;一直在刷算法题&#xff0c;确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来&#xff0c;那么Python的爬虫就这样开始学习了。 注&#xff1a;文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…
最新文章