#include #include #include #include #include #include #include #include "cutil.h" #include "cublas.h" #include const int MAX_GPU_COUNT = 2; //create an array of 2 event Handles HANDLE hEvent[MAX_GPU_COUNT]; HANDLE StartEvent[MAX_GPU_COUNT]; typedef struct{ int dataN; float pointA[32]; float pointB[32]; float AtimesB[32]; } AREA; AREA plan[2]; //CUDA fuctions extern "C" void vecDOTvec(float* DEVICE1, float* DEVICE2, float* RESULT, int ROW); //////////////////////////////////////////////////////////////////////////////// //First Thread Function static void Thread1 (LPVOID lpParam){ CUDA_SAFE_CALL(cudaSetDevice(0)); float *d_Data1, *d_Data2, *d_Mul; cublasStatus status; status = cublasInit(); status = cublasAlloc(plan[0].dataN * 1, sizeof(float), (void**)&d_Data1); status = cublasAlloc(plan[0].dataN * 1, sizeof(float), (void**)&d_Data2); status = cublasAlloc(plan[0].dataN * 1, sizeof(float), (void**)&d_Mul); while (true){ WaitForMultipleObjects(MAX_GPU_COUNT, StartEvent, TRUE, INFINITE); CUDA_SAFE_CALL(cudaMemcpy(d_Data1, plan[0].pointA, sizeof(float)*32, cudaMemcpyHostToDevice)); CUDA_SAFE_CALL(cudaMemcpy(d_Data2, plan[0].pointB, sizeof(float)*32, cudaMemcpyHostToDevice)); vecDOTvec(d_Data1, d_Data2, d_Mul, plan[0].dataN); CUDA_SAFE_CALL(cudaThreadSynchronize()); status = cublasGetVector(plan[0].dataN,sizeof(float), d_Mul, 1, plan[0].AtimesB, 1); ResetEvent(StartEvent[0]); SetEvent(hEvent[0]); } cublasFree(d_Data1); cublasFree(d_Data2); cublasFree(d_Mul); } //Second Thread Function static void Thread2 (LPVOID lpParam){ CUDA_SAFE_CALL(cudaSetDevice(1)); float *d_Data1, *d_Data2, *d_Mul; cublasStatus status; status = cublasInit(); status = cublasAlloc(plan[1].dataN * 1, sizeof(float), (void**)&d_Data1); status = cublasAlloc(plan[1].dataN * 1, sizeof(float), (void**)&d_Data2); status = cublasAlloc(plan[1].dataN * 1, sizeof(float), (void**)&d_Mul); while (true){ WaitForMultipleObjects(MAX_GPU_COUNT, StartEvent, TRUE, INFINITE); CUDA_SAFE_CALL(cudaMemcpy(d_Data1, plan[1].pointA, sizeof(float)*32, cudaMemcpyHostToDevice)); CUDA_SAFE_CALL(cudaMemcpy(d_Data2, plan[1].pointB, sizeof(float)*32, cudaMemcpyHostToDevice)); vecDOTvec(d_Data1, d_Data2, d_Mul, plan[1].dataN); CUDA_SAFE_CALL(cudaThreadSynchronize()); status = cublasGetVector(plan[1].dataN,sizeof(float), d_Mul, 1, plan[1].AtimesB, 1); ResetEvent(StartEvent[1]); SetEvent(hEvent[1]); } cublasFree(d_Data1); cublasFree(d_Data2); cublasFree(d_Mul); } void main(int argc, char** argv) { int i=0, a; float time; unsigned int hTimer; cublasStatus status; CUT_SAFE_CALL( cutCreateTimer(&hTimer) ); for (a = 0; a < MAX_GPU_COUNT; a++){ plan[a].dataN=32; for(int j = 0; j < 32; j++){ plan[a].pointA[j] = j;//(float)rand() / (float)RAND_MAX; plan[a].pointB[j] = j*10;//(float)rand() / (float)RAND_MAX; } } for (int i=0; i