7、编程题:
参照相关实例,按照要求分别编写三段程序完成以下功能,求出双精度数组A[10000](已初始化,并已装载到相关节点)中的最大值。
1)用win32 API线程函数库方式实现,编写两个子线程,两个子线程分别计算局部最大值,主线程采用事件对象进行同步后获得两个局部最大值,然后比较后获得全局最大值。所涉及的win32线程函数有CreatThread、CreateEvent、SetEvent、WaitForSingleObject等
2)用OpenMP进行域并行化方式实现。线程数目为2,所涉及OpenMP编译指导语句有#pragma omparaallel等
3)采用MPI库实现,完成各个节点计算后采用规约函数实现从局部最大值挑出全局最大值,最后编号为0的节点输出最大值。

解决方案 »

  1.   

    我做java的,别人给的任务,我不知道怎么写。不是不想写,做java没法做啊
      

  2.   

    很想帮你,可是我以前是做cobol的,爱莫能助啊,爱莫能助... ....
      

  3.   

    写个Sample Code 给你吧//#include <windows.h>
    #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;
    }
      

  4.   

    #include "stdafx.h"
    #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 ;
            
    }
    我写的第一个