从核作业计算问题



  • 我想请问一下从核使用指针传递数组,然后用athread_get或者athread_put指向数组会存在问题吗?因为数组是大小变化的,这么做会不会有什么问题?

    extern double *pa;
    extern double *pb;
    extern double *pc;
    void slave()
    {
    ...
    athread_get(PE_MODE,pa+leave*N,t_slave,NLUS,&get_reply,0,0,0);\
    athread_get(PE_MODE,pb,tm_slave,TMSIZES,&get_reply,0,0,0);
        while(get_reply!=2);
    
    ...
    
    athread_put(PE_MODE,c_slave,pc+leave,CSIZES,&put_reply,(n11-NL)*S,NL*S);
        while(put_reply!=1);
    
    }
    


  • 哪个数组的大小?



  • 我的想法是 因为从核获取数据 只能通过extern啊,所以我用一个指针指向了数组之后 例如 int a[10][10], 然后pa=a,extern到从核中,因为数组a 是局部变量 大小会变化,我不知道这样写是不是可以在神威的从核中。



  • @段晓辉 例如说

    //main.f
    subroutine mxm(a,n1,b,n2,c,n2)
             real(8) a(n1,n2),b(n2,n3),c(n1,n3)
             ...
             call my_slave(a,%val(n1),b,%val(n2),c,%val(n3))
    end
    
    //my_slave.c
    extern SLAVE_FUN(slave)();
    double *pa;
    double *pb;
    double *pc;
    int n11;
    int n22;
    int n33;
    void my_slave(double a[],int n1,double b[],int n2,double c[],int n3)
    {
        pa=a;
        pb=b;
        pc=c;
    
        n11=n1;
        n22=n2;
        n33=n3;
        
        athread_spawn(slave,0);
        athread_join();
       return ;
    }
    //slave.c
    extern double *pa;
    extern double *pb;
    extern double *pc;
    int n11;
    int n22;
    int n33;
    void slave()
    {
    ...
    athread_get(PE_MODE,pa+leave*N,t_slave,NLUS,&get_reply,0,0,0);
    athread_get(PE_MODE,pb,tm_slave,TMSIZES,&get_reply,0,0,0);
        while(get_reply!=2);
    
    ...
    
    athread_put(PE_MODE,c_slave,pc+leave,CSIZES,&put_reply,(n11-NL)*S,NL*S);
        while(put_reply!=1);
    }
    

    就是我想问的是在fortran和c的交叉编译,然后【通过传指针的方式把数组传到从核】,这样的方式支持在神威上?
    又或者说能不能【通过传指针的方式传数组到从核(因为需要获取主存数据)】?



  • 应该是可以的.
    事实上athread_spawn支持传一个结构体作为参数, 所以你可以用结构体.
    数组大小变化不会影响指针, 但你自己要清楚每一维有多大



  • @段晓辉 好的谢谢,结构体这个方法也不错 我试试这个 。


登录后回复