S
解放音乐收藏:3步突破NCM格式限制实现跨设备自由播放
首页
速度
优化工具
☰
首页
速度
收录
工具
首页
/
速度优化
/
Z-Image模型容器化部署:使用Docker简化安装流程
网站优化
AI 白嫖代码:中小型开发组织的开源困境与破局之道 —— Blazor WASM 与 MWGA 如何帮助中小团队在 AI 时代破局
语音识别利器:Qwen3-ASR-1.7B在医疗转录场景中的实战应用
2026-06-13 07:31:30
阅读时长:5分钟
562次阅读
核心内容摘要
中国教育最缺的是钱的教育:一名架构师的财商认知重构指南
基本广播操作 (MPI_Bcast)#include stdio.h #include stdlib.h #include mpi.h int main(int argc, char** argv) { MPI_Init(argc, argv); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); int n 10; // 数组长度 int* array NULL; // 根进程通常是 rank 0初始化数组 if (rank
{ array (int*)malloc(n * sizeof(int)); for (int i 0; i n; i) { array[i] i * 10; // 示例数据 } printf(Rank %d: Initialized array: , rank); for (int i 0; i n; i) { printf(%d , array[i]); } printf(\n); } else { // 其他进程分配内存 array (int*)malloc(n * sizeof(int)); } // 广播数组长度先广播长度再广播数据 MPI_Bcast(n, 1, MPI_INT, 0, MPI_COMM_WORLD); // 广播整个数组 MPI_Bcast(array, n, MPI_INT, 0, MPI_COMM_WORLD); // 所有进程打印接收到的数组 printf(Rank %d: Received array: , rank); for (int i 0; i n; i) { printf(%d , array[i]); } printf(\n); free(array); MPI_Finalize(); return 0; }
动态数组广播长度未知#include stdio.h #include stdlib.h #include mpi.h int main(int argc, char** argv) { MPI_Init(argc, argv); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); int* array NULL; int n 0; // 根进程确定数组长度和内容 if (rank
{ // 假设根据某些条件确定长度 n size * 3; // 示例每个进程处理3个元素 array (int*)malloc(n * sizeof(int)); for (int i 0; i n; i) { array[i] i * 5; } printf(Root: Broadcasting array of size %d\n, n); } // 第一步广播数组长度 MPI_Bcast(n, 1, MPI_INT, 0, MPI_COMM_WORLD); // 非根进程分配内存 if (rank !
{ array (int*)malloc(n * sizeof(int)); } // 第二步广播数组数据 MPI_Bcast(array, n, MPI_INT, 0, MPI_COMM_WORLD); // 验证广播结果 printf(Rank %d: First element %d, Last element %d\n, rank, array[0], array[n-1]); free(array); MPI_Finalize(); return 0; }
二维数组广播#include stdio.h #include stdlib.h #include mpi.h int main(int argc, char** argv) { MPI_Init(argc, argv); int rank; MPI_Comm_rank(MPI_COMM_WORLD, rank); int rows 3, cols 4; int** matrix NULL; // 根进程初始化矩阵 if (rank
{ matrix (int**)malloc(rows * sizeof(int*)); for (int i 0; i rows; i) { matrix[i] (int*)malloc(cols * sizeof(int)); for (int j 0; j cols; j) { matrix[i][j] i * cols j; } } printf(Root matrix:\n); for (int i 0; i rows; i) { for (int j 0; j cols; j) { printf(%2d , matrix[i][j]); } printf(\n); } } // 广播维度信息 int dims[2]; if (rank
{ dims[0] rows; dims[1] cols; } MPI_Bcast(dims, 2, MPI_INT, 0, MPI_COMM_WORLD); rows dims[0]; cols dims[1]; // 非根进程分配内存 if (rank !
{ matrix (int**)malloc(rows * sizeof(int*)); for (int i 0; i rows; i) { matrix[i] (int*)malloc(cols * sizeof(int)); } } // 逐行广播二维数组在内存中不连续 for (int i 0; i rows; i) { MPI_Bcast(matrix[i], cols, MPI_INT, 0, MPI_COMM_WORLD); } // 验证结果 printf(Rank %d: matrix[1][2] %d\n, rank, matrix[1][2]); // 清理内存 for (int i 0; i rows; i) { free(matrix[i]); } free(matrix); MPI_Finalize(); return 0; }
使用派生数据类型广播连续内存块#include stdio.h #include stdlib.h #include mpi.h typedef struct { int id; double value; char name[20]; } Data; int main(int argc, char** argv) { MPI_Init(argc, argv); int rank; MPI_Comm_rank(MPI_COMM_WORLD, rank); int count 5; Data* data_array NULL; // 创建派生数据类型 MPI_Datatype MPI_DATA_TYPE; int blocklengths[3] {1, 1, 20}; MPI_Aint displacements[3]; MPI_Datatype types[3] {MPI_INT, MPI_DOUBLE, MPI_CHAR}; Data dummy; MPI_Get_address(dummy.id, displacements[0]); MPI_Get_address(dummy.value, displacements[1]); MPI_Get_address(dummy.name, displacements[2]); // 计算相对位移 for (int i 2; i 0; i--) { displacements[i] - displacements[0]; } MPI_Type_create_struct(3, blocklengths, displacements, types, MPI_DATA_TYPE); MPI_Type_commit(MPI_DATA_TYPE); // 根进程初始化数据 if (rank
{ data_array (Data*)malloc(count * sizeof(Data)); for (int i 0; i count; i) { data_array[i].id i; data_array[i].value i *
5; sprintf(data_array[i].name, Item_%d, i); } } else { data_array (Data*)malloc(count * sizeof(Data)); } // 广播数据 MPI_Bcast(data_array, count, MPI_DATA_TYPE, 0, MPI_COMM_WORLD); // 验证结果 printf(Rank %d: Data[2] {id:%d, value:%.2f, name:%s}\n, rank, data_array[2].id, data_array[2].value, data_array[2].name); free(data_array); MPI_Type_free(MPI_DATA_TYPE); MPI_Finalize(); return 0; }
编译和运行# 编译 mpicc -o broadcast_array broadcast_array.c # 运行使用4个进程 mpirun -np 4 ./broadcast_array # 或指定机器文件 mpirun -np 4 -machinefile hosts.txt ./broadcast_array
MPI 广播的知识点
总结MPI_Bcast 参数int MPI_Bcast(void *buffer, // 数据缓冲区 int count, // 元素数量 MPI_Datatype datatype, // 数据类型 int root, // 根进程rank MPI_Comm comm) // 通信域广播步骤根进程准备数据非根进程分配内存广播长度信息如果需要广播数据本身内存管理所有进程都需要为接收的数据分配内存广播前内存必须已分配广播后所有进程的数据完全相同性能考虑大数组广播可能成为性能瓶颈考虑使用 scatter/gather 或特定模式对于非常大的数据可能需要分段广播错误处理检查内存分配是否成功验证广播返回值确保所有进程使用相同的参数这个示例展示了 MPI 中广播数组的基本用法可以根据实际需求进行调整和优化。
9.1免费网站nba在线观看看-9.1免费网站nba在线观看看应用
相关标签
鸣神大社的月下幽影:八重神子与丘丘人禁忌剧本的深度解析
黑桃M8M30:解锁神秘代码,开启无限可能_1
沐浴灵韵:身体的诗篇与感官的觉醒
告别繁琐,拥抱灵感:在校生专属Vlog免费软件,让你的创意闪闪发光!
《地下偶像NASA》:探索樱花盛开的二次元宇宙,不止是歌声,更是梦想的星辰大海!
为了丈夫升职我让丈夫去公司上班
巴士小秘说,探索不为人知的秘密,发现城市角落的美丽与惊喜
探秘“锕铜铜铜铜”:不止于声,更是一种生活态度
漫享奇遇:禁漫天堂,你的专属二次元精神家园
每日大赛,角逐青春荣耀——海角校园大赛,点燃你的无限可能!
7777不止是数字
梦启星辰,情动千年:鞠婧祎《造梦》在线免费追剧攻略
满天星《特殊诊所》:解锁未知,重塑心灵的秘密花园
兽娘通信海洋馆鲸鱼娘的日常
🔍
📑
文章目录
二、解密未来育儿:为什么“uu幼儿儿童网站2025官方版”成了90后父母的新宠?
三、岁月如歌:致敬中国“老太太”们的智慧与芳华
四、铜铜钢铿锵时间铸就的非凡两年半_1
五、《法国空乘9》:当优雅遇上道德困境,一场关于人性与选择的深刻拷问
🔥
热门优化文章
用大白话讲解人工智能(3) 线性回归:用“画直线“预测未来的魔法
2026-05-16 23:19:13
对比测试:YOLOv10与YOLOv8在相同场景下的表现差异
2026-05-16 23:19:13
🛠️
实用工具推荐
Multisim 波形发生器系统设计:从仿真到优化的全流程解析
大数据计算机毕设之基于springboot+深度学习的饮食计划推荐与交流分享平台(完整前后端代码+说明文档+LW,调试定制等)
相关优化文章 推荐
揭秘“隐藏通道5秒自动进入官方版”:一场颠覆你认知的数字奇遇!
岁月留痕,情比金坚:中国老夫老妻的“性”福密码
2026-06-13 07:31:30 9分钟阅读
告别成本烦恼,开启无限可能——永久免费的黄冈网站建设源码,让您的在线梦想触手可及!
Rule34安卓安装包的秘密花园:探索未知的边界
2026-06-13 07:31:30 4分钟阅读
ADN–622在线中文字幕
17cc永久地域网名
2026-06-13 07:31:30 5分钟阅读
↑
百度百家号客服电话人工服务
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3