博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言实现并行求和算法
阅读量:5734 次
发布时间:2019-06-18

本文共 1828 字,大约阅读时间需要 6 分钟。

hot3.png

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。

本文欢迎转载,转载请注明作者与出处

作者:流星

出处:

转载于:https://my.oschina.net/u/157503/blog/86871

你可能感兴趣的文章
EL表达式无法显示Model中的数据
查看>>
Linux应用小技巧
查看>>
考题纠错2
查看>>
ps6-工具的基础使用
查看>>
关于CefSharp.WinForms的学习
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
linux 参数内核
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>
计组_定点数一位乘_布斯公式
查看>>
linux下使用过的命令总结(未整理完)
查看>>
ES6的一些文章
查看>>
LeetCode 198, 213 House Robber
查看>>
New Year Permutation(Floyd+并查集)
查看>>
Qt编写输入法V2018超级终结版
查看>>
<context:component-scan>详解
查看>>
DS博客作业07--查找
查看>>
[JOI2017] サッカー (Soccer)
查看>>
Git 方法
查看>>
[Python] numpy.nonzero
查看>>