#include #include #include #include "DKSOPAL.h" #include #include "cuda_runtime.h" void initData(double3 *data, int N) { for (int i = 0; i < N; i++) { data[i].x = (double)rand() / RAND_MAX; data[i].y = (double)rand() / RAND_MAX; data[i].z = (double)rand() / RAND_MAX; } } void initDt(double *data, int N) { for (int i = 0; i < N; i++) { data[i] = 0.00001; } } int main(int argc, char *argv[]) { int loop = 10; int numpart = 1e5; char *api_name = new char[10]; char *device_name = new char[10]; strcpy(api_name, "Cuda"); strcpy(device_name, "-gpu"); for (int i = 1; i < argc; i++) { if (argv[i] == std::string("-mic")) { strcpy(api_name, "OpenMP"); strcpy(device_name, "-mic"); } if (argv[i] == std::string("-npart")) { numpart = atoi(argv[i+1]); i++; } if (argv[i] == std::string("-loop")) { loop = atoi(argv[i+1]); i++; } } std::cout << "=========================BEGIN TEST=========================" << std::endl; std::cout << "Use api: " << api_name << "\t" << device_name << std::endl; std::cout << "Number of particles: " << numpart << std::endl; std::cout << "Number of loops: " << loop << std::endl; std::cout << "------------------------------------------------------------" << std::endl; int ierr; DKSOPAL dksbase; dksbase.setAPI(api_name, strlen(api_name)); dksbase.setDevice(device_name, strlen(api_name)); ierr = dksbase.initDevice(); if (ierr != DKS_SUCCESS) std::cout << "Error with init device!" << std::endl; double3 *R = new double3[numpart]; double3 *P = new double3[numpart]; double3 *Ef = new double3[numpart]; double3 *Bf = new double3[numpart]; double *dt = new double[numpart]; initData(R, numpart); initData(P, numpart); initData(Ef, numpart); initData(Bf, numpart); initDt(dt, numpart); void *r_ptr, *p_ptr, *ef_ptr, *bf_ptr, *dt_ptr; r_ptr = dksbase.allocateMemory(numpart, ierr); p_ptr = dksbase.allocateMemory(numpart, ierr); ef_ptr = dksbase.allocateMemory(numpart, ierr); bf_ptr = dksbase.allocateMemory(numpart, ierr); dt_ptr = dksbase.allocateMemory(numpart, ierr); dksbase.writeData(r_ptr, R, numpart); dksbase.writeData(p_ptr, P, numpart); dksbase.writeData(ef_ptr, Ef, numpart); dksbase.writeData(bf_ptr, Bf, numpart); dksbase.writeData(dt_ptr, dt, numpart); for (int i = 0; i < loop; ++i) dksbase.callParallelTTrackerPush(r_ptr, p_ptr, dt_ptr, numpart, 1.0); std::cout << std::fixed << std::setprecision(4); for (int i = 0; i < 10; i++) std::cout << R[i].x << "\t" << R[i].y << "\t" << R[i].z << std::endl; std:: cout << "..." << std::endl; for (int i = numpart - 10; i < numpart; i++) std::cout << R[i].x << "\t" << R[i].y << "\t" << R[i].z << std::endl; std::cout << "============" << std::endl; dksbase.readData(r_ptr, R, numpart); std::cout << std::fixed << std::setprecision(4); for (int i = 0; i < 10; i++) std::cout << R[i].x << "\t" << R[i].y << "\t" << R[i].z << std::endl; std:: cout << "..." << std::endl; for (int i = numpart - 10; i < numpart; i++) std::cout << R[i].x << "\t" << R[i].y << "\t" << R[i].z << std::endl; dksbase.freeMemory(r_ptr, numpart); dksbase.freeMemory(p_ptr, numpart); dksbase.freeMemory(ef_ptr, numpart); dksbase.freeMemory(bf_ptr, numpart); dksbase.freeMemory(dt_ptr, numpart); delete[] R; delete[] P; delete[] Ef; delete[] Bf; delete[] dt; }