Mercurial > hg > Game > Cerium
diff example/Cuda/main.cc @ 1918:15e8c50ed570 draft
add cuda sample, not running
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 24 Jan 2014 07:16:26 +0900 |
parents | |
children | d6e033734c12 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Cuda/main.cc Fri Jan 24 07:16:26 2014 +0900 @@ -0,0 +1,76 @@ +#include <stdio.h> + +#include <cuda.h> + +#define LENGTH 1000 + +void check_data(float* A,float* B,float* C) { + for (int i=0; i<LENGTH; i++) { + if (A[i]*B[i]!=C[i]) { + puts("failure."); + return; + } + } + puts("success."); + return; +} + + + +int main() { + CUdevice device; + CUcontext context; + CUmodule module; + CUfunction function; + // CUresult result; + + cuInit(0); + cuDeviceGet(&device, 0); + cuCtxCreate(&context, 0, device); + cuModuleLoad(&module, "multiply.cu"); + cuModuleGetFunction(&function, module, "multiply"); + + float* A = new float[LENGTH]; + float* B = new float[LENGTH]; + float* C = new float[LENGTH]; + + for (int i=0; i<LENGTH; i++) { + A[i] = (float)(i+1000); + B[i] = (float)(i+1)/10.f; + } + + CUdeviceptr devA,devB,devC; + + cuMemAlloc(&devA, LENGTH*sizeof(float)); + cuMemAlloc(&devB, LENGTH*sizeof(float)); + cuMemAlloc(&devC, LENGTH*sizeof(float)); + + cuMemcpyHtoD(devA, A, LENGTH*sizeof(float)); + cuMemcpyHtoD(devB, B, LENGTH*sizeof(float)); + cuMemcpyHtoD(devC, C, LENGTH*sizeof(float)); + + cuParamSetv(function, 0, A, LENGTH*sizeof(float)); + cuParamSetv(function, 0, B, LENGTH*sizeof(float)); + cuParamSetv(function, 0, C, LENGTH*sizeof(float)); + + cuLaunchKernel(function, + LENGTH, 1, 1, + 1, 1, 1, + 0, NULL, NULL, NULL); + + cuMemcpyDtoH(C, devC, LENGTH*sizeof(float)); + + check_data(A, B, C); + + delete[] A; + delete[] B; + delete[] C; + cuModuleUnload(module); + cuMemFree(devA); + cuMemFree(devB); + cuMemFree(devC); + + + return 0; +} +