7、编程题:
参照相关实例,按照要求分别编写三段程序完成以下功能,求出双精度数组A[10000](已初始化,并已装载到相关节点)中的最大值。
1)用win32 API线程函数库方式实现,编写两个子线程,两个子线程分别计算局部最大值,主线程采用事件对象进行同步后获得两个局部最大值,然后比较后获得全局最大值。所涉及的win32线程函数有CreatThread、CreateEvent、SetEvent、WaitForSingleObject等
2)用OpenMP进行域并行化方式实现。线程数目为2,所涉及OpenMP编译指导语句有#pragma omparaallel等
3)采用MPI库实现,完成各个节点计算后采用规约函数实现从局部最大值挑出全局最大值,最后编号为0的节点输出最大值。
参照相关实例,按照要求分别编写三段程序完成以下功能,求出双精度数组A[10000](已初始化,并已装载到相关节点)中的最大值。
1)用win32 API线程函数库方式实现,编写两个子线程,两个子线程分别计算局部最大值,主线程采用事件对象进行同步后获得两个局部最大值,然后比较后获得全局最大值。所涉及的win32线程函数有CreatThread、CreateEvent、SetEvent、WaitForSingleObject等
2)用OpenMP进行域并行化方式实现。线程数目为2,所涉及OpenMP编译指导语句有#pragma omparaallel等
3)采用MPI库实现,完成各个节点计算后采用规约函数实现从局部最大值挑出全局最大值,最后编号为0的节点输出最大值。
解决方案 »
- VS2008调试模式下的有些局部变量监视不了
- 学习windows程序设计的疑问
- 刚下了个winleak_1.1.3检测vc编的软件的内存泄露,可不会看报告,求分析!
- 动态创建static,是怎么响应事件的,能不能响应,如何响应的
- 二级菜单弹出时发送什么消息
- 求数据转发的源代码,提供思路也可以.
- SQL server 复制表的语句是什么呀?
- 用VC6写com组件实现文件上传,遇到棘手问题,请赐教
- 谁有mcsd 70-016的bibble?([email protected])
- 这是一个外部程序的没有关闭 最大化 最小化的窗口 它是自动弹出的 我用findwindow获得它的句柄 但sendmessage没响应 请问怎么办 谢谢
- ★★★★★怎样对指定的窗口进行模拟键盘操作?★★★★★
- 求助获取窗口句柄问题
#include <stdio.h>
#include <Windows.h>
HANDLE hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
DWORD WINAPI CompareRoutine(PVOID p) //比较函数,按从小到大重新排列,所以最后只需比较最后面的两个就好了
{
char * a = (char*)p;
WaitForSingleObject(hEvent,INFINITE);
for ( int i = 0; i != 3; i ++)
{
for ( int j = i + 1; j != 3; j++ )
{
if ( a[i] > a[j])
{
char temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
//ResetEvent(hEvent);
SetEvent(hEvent);
return 0;
}
int main(){
char a[6] = {'d','a','b','e','g','f'};
char* p = a;
HANDLE hArray[2],h1 = NULL,h2 = NULL;
hArray[0] = h1;
hArray[1] = h2;
h1 = CreateThread(NULL, 0, &CompareRoutine,(PVOID)p,0,NULL);
h2 = CreateThread(NULL, 0, &CompareRoutine,(PVOID)(p + 3),0,NULL);
WaitForMultipleObjects(2,hArray,TRUE,INFINITE);
putchar(a[2]); //第一个线程最大的那个
putchar('\n');
putchar (a[5]);//第二个线程最大的那个
return 0;
}
#include <windows.h>
#include <process.h>
#include <iostream>
#include <fstream>
using namespace std;
int first,second;//用于存放线程计算出来的结果,最后用于比较
int max;//数组中的最大值
double A[10000]//源数组题中已经初始化了,故不再初始化了。
HANDLE evFinishFirst, evFinishSecond;//两个事件对象,用于表示两个子线程是否完成了计算int CheckMax(int a[],int start,int end)
{
int max=a[start];
for(int i=start;i<=end;i++) if (max>z[i]) max=z[i];return a[i];
}//数组中求最大值的函数void FirstThread(LPVOID param)
{
first=CheckMax(A[10000],0,5000);
SetEvent (evFinishFirst);
}
void SecondThread(LPVOID param)
{
second=CheckMax(A[10000],5001,10000);
SetEvent (evFinishSecond);
}
int main(int argc , char * argv[])
{
evFinishFirst, = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;
evFinishSecond= CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;
_beginthread(FirstThread , 0 , NULL) ;
_beginthread(SecondThread , 0 , NULL) ;
WaitForSingleObject (evFinishFirst,INFINITE) ;
WaitForSingleObject (evFinishSecond,INFINITE);
if(a>b)
max=a;
else max=b;
cout<<"the max number in A is"<<max<<endl;
return 0 ;
}
我写的第一个