#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <mpi.h>
#include <cmath>
#include <semaphore.h>
#include <pthread.h>
using namespace std;
const int n=1024;
const int mpi_num = 1;
int average_row;
float A[n][n];
const int NUM_THREADS=7;
sem_t sem_main;
sem_t sem_workerstart[NUM_THREADS];
sem_t sem_workerend[NUM_THREADS];
typedef struct
{
int t_id;
int rank;
}threadParam_t;
void *threadFunc(void *param)
{
threadParam_t *p = (threadParam_t*)param;
int t_id = p->t_id;
int rank = p->rank;
for(int k=0;k<n;k++)
{
int total_begin = max(average_row*rank,k+1);
int total_end = average_row*(rank+1);
int avgnum = (total_end-total_begin)/NUM_THREADS;
int begin = total_begin + avgnum*t_id;
int end = total_begin + avgnum*(t_id+1);
if(t_id==6)
end = total_end;
sem_wait(&sem_workerstart[t_id]);
if(avgnum>0)
{
for(int i=begin;i<end;i++)
{
for(int j=k+1;j<n;j++)
{
A[i][j] = A[i][j] - A[i][k] * A[k][j];
}
A[i][k] = 0;
}
}
sem_post(&sem_main);
sem_wait(&sem_workerend[t_id]);
}
pthread_exit(NULL);
}
int main(int argc,char* argv[])
{
int buf[2048],provided;
struct timespec startTime;
struct timespec endTime;
time_t dsec;
long dnsec;
int rank,size;
MPI_Status status;
MPI_Init_thread(&argc,&argv,MPI_THREAD_FUNNELED,&provided);
if(provided<MPI_THREAD_FUNNELED)
MPI_Abort(MPI_COMM_WORLD,1);
timespec_get(&startTime,TIME_UTC);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
average_row = n/size;
double tb = MPI_Wtime();
sem_init(&sem_main,0,0);
for(int i=0;i<NUM_THREADS;i++)
{
sem_init(&sem_workerstart[i],0,0);
sem_init(&sem_workerend[i],0,0);
}
pthread_t handles[NUM_THREADS];
threadParam_t param[NUM_THREADS];
for(int t_id=0;t_id<NUM_THREADS;t_id++)
{
param[t_id].t_id = t_id;
param[t_id].rank = rank;
}
for(int t_id=0;t_id<NUM_THREADS;t_id++)
pthread_create(&handles[t_id],NULL,threadFunc,(void*)(¶m[t_id]));
if(rank==0)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
A[i][j] = 0;
A[i][i] = 1;
}
}
if(rank==0)
{
for(int i=1;i<size;i++)
MPI_Send(&A[0][0],n*n,MPI_FLOAT,i,i,MPI_COMM_WORLD);
}
else
{
MPI_Recv(&A[0][0],n*n,MPI_FLOAT,0,rank,MPI_COMM_WORLD,&status);
}
for(int k=0;k<n;k++)
{
//注意能不能消去干净
if(k>=average_row*rank && k<average_row*(rank+1))
{
for(int j=k+1;j<n;j++)
A[k][j] = A[k][j]/A[k][k];
A[k][k] = 1.0;
for(int j=0;j<size;j++)
{
if(rank != j)
MPI_Send(&A[k][0],n,MPI_FLOAT,j,j,MPI_COMM_WORLD);
}
}
else
{
MPI_Recv(&A[k][0],n,MPI_FLOAT,k/average_row,rank,MPI_COMM_WORLD,&status);
}
//注意此处
for(int i=0;i<NUM_THREADS;i++)
sem_post(&sem_workerstart[i]);
for(int i=0;i<NUM_THREADS;i++)
sem_wait(&sem_main);
for(int i=0;i<NUM_THREADS;i++)
sem_post(&sem_workerend[i]);
}
//还差一个汇总
if(rank==0)
{
for(int i=1;i<size;i++)
{
MPI_Recv(&A[average_row*i][0],n*average_row,MPI_FLOAT,i,i,MPI_COMM_WORLD,&status);
}
}
else
{
MPI_Send(&A[average_row*rank][0],n*average_row,MPI_FLOAT,0,rank,MPI_COMM_WORLD);
}
timespec_get(&endTime,TIME_UTC);
dsec=endTime.tv_sec - startTime.tv_sec;
dnsec=endTime.tv_nsec-startTime.tv_nsec;
double te = MPI_Wtime();
if(rank==0)
{
printf("%llu.%09llus\n",dsec,dnsec);
cout<<endl;
}
printf("Time:%f s\n",te-tb);
MPI_Finalize();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现普通高斯消去法和特殊高斯消去法的MPI编程(源码+图片).rar
共30个文件
jpg:16个
cpp:13个
md:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 143 浏览量
2023-04-10
17:27:12
上传
评论
收藏 222KB RAR 举报
温馨提示
1、资源内容:基于C++实现普通高斯消去法和特殊高斯消去法的MPI编程(源码+图片).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、更多仿真源码和数据集下载列表(自行寻找自己需要的):https://blog.csdn.net/m0_62143653?type=download 4、免责声明:本资源作为“参考资料”而不是“定制需求”不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。
资源推荐
资源详情
资源评论
收起资源包目录
基于C++实现普通高斯消去法和特殊高斯消去法的MPI编程(源码+图片).rar (30个子文件)
基于C++实现普通高斯消去法和特殊高斯消去法的MPI编程(源码+图片)
按块划分 AVX512.cpp 3KB
流水线算法.cpp 2KB
2.jpg 18KB
说明.md 84B
串行算法.cpp 1KB
10.jpg 23KB
按块划分 Pthread.cpp 4KB
按列划分.cpp 2KB
13.jpg 24KB
14.jpg 23KB
6.jpg 24KB
15.jpg 26KB
16.jpg 25KB
1.jpg 21KB
按块划分 SSE.cpp 3KB
均匀划分-静态.cpp 2KB
12.jpg 24KB
按块划分.cpp 2KB
均匀划分-动态.cpp 2KB
5.jpg 25KB
非阻塞通信.cpp 2KB
广播方式.cpp 2KB
按块划分 OpenMP.cpp 3KB
8.jpg 25KB
按块划分 AVX.cpp 3KB
11.jpg 24KB
3.jpg 18KB
7.jpg 25KB
9.jpg 26KB
4.jpg 19KB
共 30 条
- 1
资源评论
- dhxcnx2024-06-12资源不错,内容挺好的,有一定的使用价值,值得借鉴,感谢分享。
- 2301_768318172023-07-07资源中能够借鉴的内容很多,值得学习的地方也很多,大家一起进步!
- 2201_758864862023-06-09资源很不错,内容和描述一致,值得借鉴,赶紧学起来!
Matlab仿真实验室
- 粉丝: 3w+
- 资源: 2405
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功