从核作业计算问题
-
我想请问一下从核使用指针传递数组,然后用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支持传一个结构体作为参数, 所以你可以用结构体.
数组大小变化不会影响指针, 但你自己要清楚每一维有多大
-
@段晓辉 好的谢谢,结构体这个方法也不错 我试试这个 。