int main(int argc, char* argv[]) { int i; int n = SIZE; /* open device for threads */ int dd = coprthr_dopen(COPRTHR_DEVICE_E32,COPRTHR_O_THREAD); /* compile thread function */ coprthr_program_t prg = coprthr_cc_read_bin("./memory_device.e32",0); coprthr_sym_t thr = coprthr_getsym(prg,"my_thread"); printf("dd=%d prg=%p krn=%p\n",dd,prg,thr); /* allocate memory shared with coprocessor device */ coprthr_mem_t aa_mem = coprthr_dmalloc(dd,n*sizeof(int),0); coprthr_mem_t bb_mem = coprthr_dmalloc(dd,n*sizeof(int),0); coprthr_mem_t cc_mem = coprthr_dmalloc(dd,n*sizeof(int),0); int* aa = (int*)coprthr_memptr(aa_mem,0); int* bb = (int*)coprthr_memptr(bb_mem,0); int* cc = (int*)coprthr_memptr(cc_mem,0); /* set args to pass to thread on coprocessor device */ coprthr_mem_t args_mem = coprthr_dmalloc(dd,sizeof(struct my_args),0); struct my_args* pargs = (struct my_args*)coprthr_memptr(args_mem,0); pargs->n = n; pargs->aa = aa, pargs->bb = bb, pargs->cc = cc; /* initialize A, B, and C arrays */ for (i=0; i<n; i++) { aa[i] = i; bb[i] = 2*i; cc[i] = 3; } // Execute kernel on coprocessor device coprthr_dexec(dd,16,thr,(void*)&args_mem, 0 ); coprthr_dwait(dd); for(i=0; i<n; i++) printf("%d: %d + %d = %d\n",i,aa[i],bb[i],cc[i]); /* clean up */ coprthr_dfree(dd,args_mem); coprthr_dfree(dd,aa_mem); coprthr_dfree(dd,bb_mem); coprthr_dfree(dd,cc_mem); coprthr_dclose(dd); }
int main() { int i; int dd = coprthr_dopen(TEST_COPRTHR_DEVICE,COPRTHR_O_STREAM); printf("dd=%d\n",dd); coprthr_program_t prg = coprthr_dcompile(dd,src,sizeof(src),"",0); coprthr_kernel_t krn = coprthr_getsym(prg,"my_kern"); printf("prg=%p krn=%p\n",prg,krn); float* a = (float*)malloc(SIZE*sizeof(float)); float* b = (float*)malloc(SIZE*sizeof(float)); float* c = (float*)malloc(SIZE*sizeof(float)); for(i=0; i<SIZE; i++) { a[i] = 1.0f * i; b[i] = 2.0f * i; c[i] = 0.0f; } coprthr_mem_t mema = coprthr_dmalloc(dd,SIZE*sizeof(float),0); coprthr_mem_t memb = coprthr_dmalloc(dd,SIZE*sizeof(float),0); coprthr_mem_t memc = coprthr_dmalloc(dd,SIZE*sizeof(float),0); coprthr_dwrite(dd,mema,0,a,SIZE*sizeof(float),COPRTHR_E_NOWAIT); coprthr_dwrite(dd,memb,0,b,SIZE*sizeof(float),COPRTHR_E_NOWAIT); coprthr_dwrite(dd,memc,0,c,SIZE*sizeof(float),COPRTHR_E_NOWAIT); unsigned int nargs = 3; void* args[] = { &mema, &memb, &memc }; unsigned int nthr = SIZE; coprthr_dexec(dd,krn,nargs,args,nthr,0,COPRTHR_E_NOWAIT); coprthr_dcopy(dd,memc,0,memb,0,SIZE*sizeof(float),COPRTHR_E_NOWAIT); coprthr_kernel_t v_krn[] = { krn, krn }; unsigned int v_nargs[] = { nargs, nargs }; void** v_args[] = { args, args }; unsigned int v_nthr[] = { nthr, nthr }; coprthr_dnexec(dd,1,v_krn,v_nargs,v_args,v_nthr,0,COPRTHR_E_NOWAIT); coprthr_dread(dd,memc,0,c,SIZE*sizeof(float),COPRTHR_E_NOWAIT); coprthr_dwait(dd); for(i=0; i<SIZE; i++) printf("%f + %f = %f\n",a[i],b[i],c[i]); coprthr_dfree(dd,mema); coprthr_dfree(dd,memb); coprthr_dfree(dd,memc); free(a); free(b); free(c); coprthr_dclose(dd); }
int main() { int i; int dd = coprthr_dopen(COPRTHR_DEVICE_X86_64,COPRTHR_O_STREAM); printf("dd=%d\n",dd); coprthr_program_t prg = coprthr_dcompile(dd,src,sizeof(src),"",0); coprthr_kernel_t krn = coprthr_getsym(prg,"my_kern"); printf("prg=%p krn=%p\n",prg,krn); int* a = (int*)malloc(SIZE*sizeof(int)); int* b = (int*)malloc(SIZE*sizeof(int)); int* c = (int*)malloc(SIZE*sizeof(int)); int* d = (int*)malloc(SIZE*sizeof(int)); for(i=0; i<SIZE; i++) { a[i] = 1 * i; b[i] = 2 * i; c[i] = 0; d[i] = 0; } coprthr_mem_t mema = coprthr_dmalloc(dd,SIZE*sizeof(int),0); coprthr_mem_t memb = coprthr_dmalloc(dd,SIZE*sizeof(int),0); coprthr_mem_t memc = coprthr_dmalloc(dd,SIZE*sizeof(int),0); coprthr_mem_t memd = coprthr_dmalloc(dd,SIZE*sizeof(int),0); coprthr_event_t ev[10]; ev[0] = coprthr_dwrite(dd,mema,0,a,SIZE*sizeof(float),COPRTHR_E_NOWAIT); ev[1] = coprthr_dwrite(dd,memb,0,b,SIZE*sizeof(float),COPRTHR_E_NOWAIT); ev[2] = coprthr_dwrite(dd,memc,0,c,SIZE*sizeof(float),COPRTHR_E_NOWAIT); ev[3] = coprthr_dwrite(dd,memd,0,d,SIZE*sizeof(float),COPRTHR_E_NOWAIT); for(i=0;i<4;i++) coprthr_dwaitev(dd,ev[i]); unsigned int nargs = 4; void* args[] = { &mema, &memb, &memc, &memd }; unsigned int nthr = SIZE; ev[4] = coprthr_dexec(dd,krn,nargs,args,nthr,0,COPRTHR_E_NOWAIT); ev[5] = coprthr_dread(dd,memc,0,c,SIZE*sizeof(float),COPRTHR_E_NOWAIT); for(i=0; i<SIZE; i++) d[i] = 1; coprthr_dwrite(dd,memd,0,d,SIZE*sizeof(float),COPRTHR_E_NOW); for(i=4;i<6;i++) coprthr_dwaitev(dd,ev[i]); for(i=0; i<SIZE; i++) printf("%d + %d = %d\n",a[i],b[i],c[i]); coprthr_dfree(dd,mema); coprthr_dfree(dd,memb); coprthr_dfree(dd,memc); free(a); free(b); free(c); coprthr_dclose(dd); }