问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现C语言的多处理器并行计算

发布网友 发布时间:2022-04-21 23:37

我来回答

2个回答

热心网友 时间:2023-12-05 16:19

使用系统的API
参考文章:http://www.cnblogs.com/lixiaohui-ambition/archive/2012/07/26/2610336.html追问我之前搜到过这篇文章,并且照着这个例子改写过。。。但是没有实现成功。。。但是谢谢了,会采纳的

热心网友 时间:2023-12-05 16:19

1、问题描述
将数组A均匀划分成m个片段,每个数组片段最多有(n+m-1)/m 个元素。每个数组片段分别由一个线程负责局部求和,最后这些部分和加起来就得到数组中所有元素的总和。

2、相关代码
此代码在gcc4.3下编译通过
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 4
int N;
int *X;
int gSum[NUM_THREADS];
void* Summation(void *pArg){
int tNum= *((int *)pArg);
int lSum=0;
int start,end;
int i;
start = (N/NUM_THREADS)*tNum;
printf("start is:%d\n",start);
end = (N/NUM_THREADS)*(tNum+1);
printf("end is:%d\n",end);
if(tNum == NUM_THREADS -1)
end =N;
for(i=start;i<end;i++)
lSum+=X[i];
gSum[tNum]=lSum;
free(pArg);
}
void initArr(){
int i;
puts("input array length::");
scanf("%d",&N);
X=(int*)malloc(N*sizeof(int));//
for(i=0;i<N;i++)
{
X[i]=i+1;
printf("%d\t",X[i]);
}
}
int main(void){
int j,sum=0;
pthread_t tHandles[NUM_THREADS];
initArr();
for(j=0;j<NUM_THREADS;j++ ){
int *threadNum =malloc(4);
*threadNum=j;
// printf("threadNum is:%d\n",*threadNum);
pthread_create(&tHandles[j],NULL,Summation,(void*)threadNum);
}
for(j=0;j<NUM_THREADS;j++){
pthread_join(tHandles[j],NULL);
sum+= gSum[j];
}
printf("the sum of array elements is %d\n",sum);
return 0;
}

3、技术难点
1)动态数组初始化
C语言中不允许动态数组类型。例如: int n;scanf("%d",&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明,这是错误的。
这里使用malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型
void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
2)void类型转换
malloc返回类型是 void* 类型
这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void,即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。可以用强转的方法将其转换为别的类型。例如:
int *pd=NULL;
pi=(int *)malloc(N*sizeof(int));
向系统申请10个连续的int类型的存储空间,用指针pi指向这个连续的空间的首地址。
并且用(int*)对malloc的返回类型进行转换,以便把int类型数据的地址赋值给指针pi
3)主线程等待子线程结束
对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。这里用的方法是pthread_join
pthread_join方法的功能就是等待线程结束
syntax: int pthread_join(pthread_t thread, void **retval);
第一个参数,线程id,就是要等待的线程ID
第二个参数用来接受线程函数的返回值,如果没有返回值,就直接设为NULL。
本文欢迎转载,转载请注明作者与出处
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
便携式发电机十大名牌 冬天夜跑同时锻炼身体和意志的句子锦集 冬天的时候跑步可以达到46~60分钟 可是夏天了跑步25分钟左右就已经感觉... 孩子病毒性感冒咳嗽厉害怎么办 严重的病毒性感冒几天能好 宝宝六个月因为病毒性感冒而咳嗽有痰可每次咳嗽出来的痰他吐不出来怎 ... ios购买的app怎么退款 求助!书法高手!用什么书法来“魏亮”这二字最漂亮? 万事胜意,喜乐长安繁体 什么叫喜乐长安 给《圣斗士》中穆先生配音的是谁? 笔记本电脑用来编程需要那些配置?c语言编程,网页... 《间之契》的声优 电脑的屏幕亮度应该设多少对眼睛好 浙江大学 计算机科学与技术专业课程设置 公积金贷款最大额度是多少? 长时间对着电脑工作, 如何保护眼睛 C语言 多线程 并发执行 不随机 一般公积金贷款额度是多少 液晶显示器的亮度、对比度调到多少为最佳?? C语言问题,编程高手进! 更年期,头发老是一小块一小块的掉,有什么速效的方... 渭南市富平县公积金贷款额度怎么计算 电脑的亮度一般调到多少比较好啊? C语言如何同时判断5个语句 同时运行五种结果? 头发掉了一小块还会长出新头发吗 C语言中的MPI编程和多线程有什么区别,MPI编程中针... 脑袋上有一小块掉头发是怎么回事 C语言怎样才能发挥双核双CPU的作用? 掉头发,一小块,一小块都掉光了,但又会长出来,... 单片机C语言程序中,怎么能让两个命令同时进行? 有两个问题关于c语言线程进程的,还望高手解答 找一个动漫,里面的女主角叫朱雀,身边有一大堆男... C语言编译成的exe 越过系统运行 公积金贷款金额是多少 请问高手 主函数进入后 怎样进入两个同时进行的子... 有人知道为中国引进的动画片配音的人们是谁吗?可... c语言如何在一个时钟周期移动3位? 《火影忍者》中卡卡西的配音演员与《江户川柯南》... C语言嵌入式系统开发光盘下载 我如果想入门区块链技术,应该学习哪些编程语言 如何把C语言移植到ARM中 学习LabVIEW对c语言的要求多高 C语言程序使用scanf_s输入字符串按回车弹出警告 大学生应该怎样坚持自我修养 论文 大学生应该怎样加强自身职业道德修养论文 大学生怎样坚持进行自我修养论文 大学生怎样加强自身修养论文 寻求一篇有关于大学生如何提升自我素养的论文 5000... 大学生自我成长分析论文