1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # include <upc.h> # include <upc_collective.h> # include <stdio.h> # define NELEMS 3 # define FAILURE 1 # define SUCCESS 0 shared[NELEMS*THREADS] int A[THREADS][NELEMS*THREADS]; shared[NELEMS*THREADS] int B[THREADS][NELEMS*THREADS]; int main() { int i=0,j=0; // 对 A 进行初始化 for(i=0;i<NELEMS*THREADS;i++) A[MYTHREAD]=1; upc_barrier; upc_all_exchange(B,A,sizeof(int)*NELEMS,UPC_IN_NOSYNC|UPC_OUT_NOSYNC); upc_barrier; // 校验结果 for(i=0;i<NELEMS*THREADS;i++) { if(B[MYTHREAD] != 1) { printf("Error: thread=%d,result=%d,expect=%d\n",MYTHREAD,B[MYTHREAD],1); upc_global_exit(FAILURE); } } return SUCCESS; } |
1 2 | void upc_all_permute(shared void * restrict dst, shared const void * restrict src, \ shared const int * restrict perm, size_t nbytes, upc_flag_t flags); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # include <upc.h> # include <upc_collective.h> # include <stdio.h> # define NELEMS 10 # define FAILURE 1 # define SUCCESS 0 shared[NELEMS] int A[NELEMS*THREADS]; // src 指针 shared[NELEMS] int B[NELEMS*THREADS]; // dst 指针 shared int P[THREADS]; shared[] int *myB; int main() { int i=0,j=0; // 对 P 进行初始化 P[MYTHREAD]=THREADS-1-MYTHREAD; // 对 A 进行初始化 upc_forall(i=0;i<NELEMS*THREADS;i++;&A) A=i; upc_barrier; upc_all_permute(B,A,P,sizeof(int)*NELEMS,UPC_IN_NOSYNC|UPC_OUT_NOSYNC); upc_barrier; // myB 为对应的线程指向数组的第一个元素 myB=(shared[] int *)&B[MYTHREAD*NELEMS]; // 校验结果 for(i=0;i<NELEMS;i++) if(myB != (THREADS-1-MYTHREAD)*NELEMS+i) { printf("Error: thread:%d, myB[%d]=%d,expect=%d\n",MYTHREAD,i,myB, (THREADS-1- MYTHREAD)*NELEMS+i); upc_global_exit(FAILURE); } return SUCCESS; } |
1 2 3 4 | void upc_all_reduceT(shared void * restrict dst, shared const void * restrict src, upc_op_t op, \size_t nelems, size_t blk_size, TYPE(*func)(TYPE, TYPE), upc_flag_t flags); void upc_all_prefix_reduceT(shared void * restrict dst, shared const void * restrict src, upc_op_t op, \size_t nelems, size_t blk_size, TYPE(*func)(TYPE, TYPE), upc_flag_t flags); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # include <upc.h> # include <upc_collective.h> # include <stdio.h> # define SUCCESS 0 # define FAILURE 1 # define BLKSIZE1 5 # define BLKSIZE2 0 # define N 100 # define verify(result,expect) \ { if ((result)!=(expect)) \ { \ printf("Error: fail at line %d: mythread=%d, result= %d, expect= %d\n", __LINE__, MYTHREAD, result,expect); \ upc_global_exit(FAILURE); \ } \ } typedef int T; //T 的类型是整形 shared[BLKSIZE1] T srcA[N]; shared[BLKSIZE2] T srcB[N]; shared T *dst; shared T result; int main() { int i,j; // 初始化共享数组 upc_forall(i=0; i<N; i++; &srcA) srcA=i; upc_forall(i=0;i<N;i++;&srcB) srcB=-i; upc_barrier; // 初始化 dst 指针 dst=&result; /* dst 指针访问的共享数据的值为 srcA[0] + srcA[1] + srcA[N-1], 其中 0<= i <=N-1, + 是变量所指定的 运算符*/ upc_all_reduceI(dst,srcA,UPC_ADD,N,BLKSIZE1,NULL,UPC_IN_NOSYNC | UPC_OUT_NOSYNC); upc_barrier; // 校验结果 verify(*dst,(N - 1)*N/2); verify(result,(N - 1)*N/2); upc_barrier; /* dst 指针所指向共享数据的值为 srcB[0] + srcB[1] + srcB[N-1],其中 0<= i <=N-1, + 是变量指定的运 算符*/ upc_all_reduceI(dst,srcB,UPC_ADD,N,BLKSIZE2,NULL,UPC_IN_NOSYNC | UPC_OUT_NOSYNC); upc_barrier; // 校验结果 verify(*dst,-1*(N - 1)*N/2); verify(result,-1*(N - 1)*N/2); return SUCCESS; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | # include <upc.h> # include <upc_collective.h> # include <stdio.h> # define SUCCESS 0 # define FAILURE 1 # define BLKSIZE1 5 # define BLKSIZE2 0 # define N 100 # define verify(result,expect) \ { if ((result)!=(expect)) \ { \ printf("Error: fail at line %d: mythread=%d, result= %l, expect= %l\n", __LINE__, MYTHREAD, result,expect); \ upc_global_exit(FAILURE); \ } \ } typedef long T; // T 类型是一个长整型 shared[BLKSIZE1] T srcA[N]; shared[BLKSIZE2] T srcB[N]; shared[BLKSIZE1] T dstA[N]; shared[BLKSIZE2] T dstB[N]; int main() { int i; // 初始化 srcA 与 srcB upc_forall(i=0;i<N;i++;&srcA) srcA=i; upc_forall(i=0;i<N;i++;&srcB) srcB=-i; upc_barrier; /* 函数要求 upc_threadof(srcA) == upc_threadof(dstA) && upc_phaseof(srcA) == upc_phaseof(dstA), dstA所指向的共享数据的值为 srcA[0] + srcA[1] + ... + srcA, 其中 0<= i <=N-1, + 是指定的运算符*/ upc_all_prefix_reduceL(dstA,srcA,UPC_ADD,N,BLKSIZE1,NULL,UPC_IN_NOSYNC | UPC_OUT_NOSYNC); upc_barrier; // 校验结果 for(i=0;i<N;i++) verify(dstA,i*(i+1)/2); /* 函数要求 upc_threadof(srcB) == upc_threadof(dstB) && upc_phaseof(srcB) == upc_phaseof(dstB), dstB指针所指向的共享数据的值为 srcB[0] + srcB[1] + ... + srcB, 其中 0<= i <=N-1, + 是函数指定的运算符*/ upc_all_prefix_reduceL(dstB,srcB,UPC_ADD,N,BLKSIZE2,NULL,UPC_IN_ALLSYNC | UPC_OUT_ALLSYNC); //校验结果 for(i=0;i<N;i++) verify(dstB,-i*(i+1)/2); return SUCCESS; } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |