#include #include #include #include #include /* Illustrates calling 2-D kernels in R with C code on CPU and on GPU Sergey V. 2022. */ extern "C" { SEXP kfunc_kernel_cpu(SEXP x1, SEXP x2, SEXP va, SEXP vb, SEXP vc, SEXP vkname); SEXP kfunc_kernel_gpu(SEXP x1, SEXP x2, SEXP va, SEXP vb, SEXP vc, SEXP vkname, SEXP devID); } void kfunc_exp_host(double *x1, double *x2, double *Sigma, int M, int N, double a, double b, double c){ int i,j; for (i=0; i>>(x1_d, x2_d, Sigma_d, mm, nn, a, b, c); //copy result from GPU cudaMemcpy(REAL(Rval), Sigma_d, mm*nn*sizeof(double), cudaMemcpyDeviceToHost); cudaDeviceSynchronize(); // Free GPU memory if(x1_d) {cudaFree(x1_d); x1_d=NULL;} if(x2_d) {cudaFree(x2_d); x2_d=NULL;} if(Sigma_d) {cudaFree(Sigma_d); Sigma_d=NULL;} UNPROTECT(1); return Rval; }