求和程序 继续
来源:互联网 发布:linux移动多个文件 编辑:程序博客网 时间:2024/05/21 15:00
在文章"第一个多线程程序——使用pthread"中讨论了一个序列的求和程序。后来把这个程序重写了一下,用了一种并行度更高的算法,这一算法用了二叉树的算法。
用了以下的递归算法:
if right-left < N 直接求和
else
SUM(int* A, int left, int right) =
SUM(int* A, int left, int((left+right)/2)) + SUM(int* A, int((left+right)/2)+1, right)
我们将每一个分支计算用一个线程执行,写出以下算法:
#define SMALL 4000
struct add_arg
{
int* data;
int size;
int left;
int right;
long long* sum;
};
void *add(void* addarg)
{
struct add_arg *arg;
arg = (struct add_arg*)addarg;
int i;
if(arg->right-arg->left<=SMALL){
arg->sum[0] = 0;
for(i=arg->left;i<=arg->right;i++){
arg->sum[0]+=arg->data[i];
}
}
else{
pthread_t thread[2];
struct add_arg args[2];
args[0].data = arg->data;
args[0].size = arg->size;
args[0].left = arg->left;
args[0].right = int((arg->left+arg->right)/2);
args[0].sum = new long long;
args[1].data = arg->data;
args[1].size = arg->size;
args[1].left = args[0].right+1;
args[1].right = arg->right;
args[1].sum = new long long;
for(i=0;i<2;i++){
pthread_create(&thread[i],NULL,add,(void* )&args[i]);
pthread_join(thread[i],NULL);
}
arg->sum[0] = args[0].sum[0]+args[1].sum[0];
}
}
int main()
{
int N = 100000000;
int* A = new int[N];
int i;
for(i=0;i<N;i++){
if(i%2==0) A[i] = i;
else A[i] = i;
}
struct add_arg arg;
arg.data = A;
arg.size = N;
arg.left = 0;
arg.right = N-1;
arg.sum = new long long;
add((void* )&arg);
cout<<"the sum is : "<<arg.sum[0]<<endl;
}
我们求1-100000000的和。
我在单核处理器上针对不同的SMALL值运行了算法,得出结果如下
SMALL cost time(s)
100 19.51
1000 3.60
10000 1.60
100000 1.31
1000000 1.28
10000000 1.28
100000000 1.28
在SMALL=100时,系统创建了2097150个线程。
不知道这一算法在多核处理器上运行怎么样,如果有人试过,希望告诉我。
用了以下的递归算法:
if right-left < N 直接求和
else
SUM(int* A, int left, int right) =
SUM(int* A, int left, int((left+right)/2)) + SUM(int* A, int((left+right)/2)+1, right)
我们将每一个分支计算用一个线程执行,写出以下算法:
#define SMALL 4000
struct add_arg
{
int* data;
int size;
int left;
int right;
long long* sum;
};
void *add(void* addarg)
{
struct add_arg *arg;
arg = (struct add_arg*)addarg;
int i;
if(arg->right-arg->left<=SMALL){
arg->sum[0] = 0;
for(i=arg->left;i<=arg->right;i++){
arg->sum[0]+=arg->data[i];
}
}
else{
pthread_t thread[2];
struct add_arg args[2];
args[0].data = arg->data;
args[0].size = arg->size;
args[0].left = arg->left;
args[0].right = int((arg->left+arg->right)/2);
args[0].sum = new long long;
args[1].data = arg->data;
args[1].size = arg->size;
args[1].left = args[0].right+1;
args[1].right = arg->right;
args[1].sum = new long long;
for(i=0;i<2;i++){
pthread_create(&thread[i],NULL,add,(void* )&args[i]);
pthread_join(thread[i],NULL);
}
arg->sum[0] = args[0].sum[0]+args[1].sum[0];
}
}
int main()
{
int N = 100000000;
int* A = new int[N];
int i;
for(i=0;i<N;i++){
if(i%2==0) A[i] = i;
else A[i] = i;
}
struct add_arg arg;
arg.data = A;
arg.size = N;
arg.left = 0;
arg.right = N-1;
arg.sum = new long long;
add((void* )&arg);
cout<<"the sum is : "<<arg.sum[0]<<endl;
}
我们求1-100000000的和。
我在单核处理器上针对不同的SMALL值运行了算法,得出结果如下
SMALL cost time(s)
100 19.51
1000 3.60
10000 1.60
100000 1.31
1000000 1.28
10000000 1.28
100000000 1.28
在SMALL=100时,系统创建了2097150个线程。
不知道这一算法在多核处理器上运行怎么样,如果有人试过,希望告诉我。
- 求和程序 继续
- 继续修改程序
- 继续A*演示程序
- 继续程序生涯
- 继续程序开发
- 急需:JAVA求和程序
- 【程序25】阶乘 求和
- Python多线程求和程序
- 一种求和的创新思维的应用3(继续变形)
- 一种求和的创新思维的应用6(继续扩张)
- ASP中换个行继续写程序
- 抛出异常,继续处理程序
- 程序的结束与继续
- ABAP程序中的统计求和
- ABAP程序中的统计求和
- 1!+2!+...n!求和程序
- 1!+2!+...n!求和程序
- 用继续写程序来麻醉自己
- 如何使用RPM包安装Mosix?
- 使用SQL存储过程有什么好处
- 如何通过编译内核来安装Mosix?
- 管理感悟:用人篇【转载】
- 中国软件业到底需要什么样的软件政策
- 求和程序 继续
- 面向对象设计的几条经验准则
- 几个哲理小故事
- Web服务器和应用程序服务器的区别
- VB.NET:给Visual Basic带来革命!
- [想法]用TreeNodes和Frame制作设置面板
- 网页弹出窗口和iframe参数说明
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法
- 图象淡入淡出