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。
本文欢迎转载,转载请注明作者与出处
作者:流星
出处:http://blog.sina.com.cn/staratsky
分享到:
相关推荐
对于一个给定的级数,其和可以通过直接相加所有项得到,但当项数非常多时,直接求和可能不切实际,这时就需要用到求和算法。 在C语言中,我们可以采用循环结构来实现级数求和。例如,对于一个等差级数,公式通常为...
总的来说,这个压缩包提供了C语言实现的串行和并行计算圆周率π的实例,对于学习并行编程和OpenMP技术是一个很好的起点。通过理解并行代码的工作原理,开发者可以进一步探索如何在其他计算密集型任务中应用并行化,...
标题中的"FIR1_fir_fir1c语言_FIR1_C语言实现fir...这个项目对于学习数字信号处理和C语言编程的工程师来说具有很高的价值,因为它提供了从高级语言到低级语言移植算法的实际示例,有助于理解不同平台间的算法实现差异。
本资源包“并行算法实践-mpi源程序”提供了C语言实现的MPI并行算法实例,为学习和研究提供了宝贵的参考资料。 C语言是系统级编程的首选语言,其简洁高效的特点使得它非常适合编写并行算法。MPI库与C语言的结合,让...
在本压缩包“c语言滤波算法.rar”中,我们关注的是使用C语言实现滤波算法的方法。C语言因其高效、灵活和广泛的应用而成为编写这类算法的理想选择。 滤波算法的基本思想是通过某种数学模型对输入信号进行处理,以...
C语言是一种强大的编程语言,尤其适合进行数值计算和算法实现。在这里,我们将探讨如何使用C语言编写一个简单的算法来求解自然数e。 首先,求解e的基本思想是利用级数展开。e可以表示为无穷级数: \[ e = \sum_{n=...
基于openMP并行化的c语言实现的利用递归折叠的方法实现头尾相加递归调用实现高效的并行数组累加计算
本项目聚焦于一个特别的实现方式,即通过C语言编程实现基于Adaboost算法的人脸检测程序,并搭配人脸库进行训练和测试。Adaboost是一种强大的机器学习算法,特别适合用于构建弱分类器的组合,形成强分类器,如在人脸...
C语言作为广泛应用的编程语言,被广泛用于实现各种算法,包括卷积。在这个“juanji.rar”压缩包中,我们找到了一个使用C语言实现的二维数组卷积算法。 卷积是一种数学运算,通常用于分析信号或图像,通过将两个函数...
C语言实现时,需手动计算卷积过程,即对输入数据和卷积核进行逐元素乘法并求和,生成特征映射(feature map)。 2. **偏置项**:每个卷积核通常都有一个偏置值,用于调整输出特征图的响应。在C语言中,这可以通过在...
《C数值算法程序大全》是一本专注于C语言实现数值计算方法的综合资源,它涵盖了大量在科学计算、工程应用和数据分析等领域中常见的数值算法。这本书的内容丰富,旨在帮助程序员和科研人员理解并应用这些算法,以解决...
在C和C++编程语言中实现这一算法,可以提高过滤效果,尤其是在复杂或变化多端的图像环境中。 传统中值滤波器是基于像素的非线性滤波方法,它将像素邻域内的像素值按照大小排序,然后选择中间值作为该位置的新像素值...
C语言实现时需要额外的辅助函数来处理这些算法。 7. **矩阵运算的优化**:在实际编程中,为了提高效率,可以考虑使用指针操作、多线程技术,或者针对特定硬件的优化。例如,使用指针遍历矩阵元素可以减少间接寻址的...
在C语言实现CU Sketch时,需要注意以下几点: - **内存管理**:合理分配和释放内存,确保程序运行的稳定性和效率。 - **哈希函数**:选择合适的哈希函数,使得哈希碰撞的概率尽可能低,以提高算法的准确性。 - **...
在C++编程中,"C++求和设计新方式"是一种使用现代C++特性来优化和重构传统求和算法的方法。这种新思维设计通常涉及到模板元编程、泛型编程、策略模式以及类型推导等高级技术,以提高代码的可读性、可维护性和效率。...
在给定的"Simulation1.m"文件中,我们可以预期这是一个MATLAB代码,用于实现质心定位算法的仿真。通常,这样的代码会包含以下步骤: 1. 读取图像:首先,代码会加载一个二值图像或者具有明显目标区域的彩色图像。 2...
4. **算法实现**: - **梯度下降**:最常用的优化算法,用于调整权重以最小化损失函数。 - **反向传播**:计算损失函数对权重的梯度,用于更新权重。 - **激活函数**:如sigmoid、ReLU、tanh等,引入非线性,使...
- **性能考量**:对于非常大的整数,可以考虑并行计算或者使用更高效的算法来进一步提高程序的运行效率。 通过上述分析,我们可以看到该程序不仅实现了两个超大整数相加的基本功能,而且其设计思想也为解决类似问题...
**OpenMP中的并发快速求和**展示了并行编程库在实现并行算法时的强大功能。OpenMP是一种广泛使用的共享内存并行编程模型,提供了易于使用的API来添加并行化指令。例如,使用OpenMP的并行for循环,可以轻松地并行化...