useDynLib(RCUDA)

import(methods)
import(RAutoGenRunTime)

#exportMethods("$", "[[")

# exportPattern(".*")

exportClass(CUresult)

export(nvcc)
export(.gpu, .cuda)

export(copyFromDevice, copyToDevice)
export(createContext, cuGetContext)
export(cudaAlloc, cudaMalloc)

export(loadModule, getFunction)

export(getNumDevices, getDeviceProps, getDeviceProperties, cuDeviceGetAttributes)
export(cudaSetDevice )

export(cuInit)

export(cudaCSV, cudaKeyValuePair, cudaOutputMode_tValues)
export(cuMemInfo)


export(cudaProfiler, profileCUDA, cudaStartProfiler, cudaStopProfiler, readCUDAProfile)
S3method(summary, "CUDAProfileInfo")

#export(cudaErrorString)

export(cudaVersion)

exportClasses(cudaDeviceProp, cudaDevicePropPtr)


#export(CUlimitValues)

########

# Context

export(
cuCtxCreate,
cuCtxDestroy,
cuCtxPushCurrent,
cuCtxPopCurrent,
cuCtxSetCurrent,
cuCtxGetCurrent,
cuCtxGetDevice,
cuCtxSynchronize,
cuCtxSetLimit,
cuCtxGetLimit,
cuCtxGetCacheConfig,
cuCtxSetCacheConfig,
cuCtxGetSharedMemConfig,
cuCtxSetSharedMemConfig,
cuCtxGetApiVersion, # problem
cuCtxEnablePeerAccess,
cuCtxDisablePeerAccess
)

# Device

export(
cuDeviceGet,
cuDeviceGetCount,
cuDeviceGetName,
cuDeviceTotalMem,
cuDeviceGetAttribute,
cuDeviceGetByPCIBusId,
cuDeviceGetPCIBusId,
cuDeviceCanAccessPeer,
cudaDeviceReset,
cudaDeviceSynchronize,
cudaDeviceSetLimit,
cudaDeviceGetLimit,
cudaDeviceGetCacheConfig,
cudaDeviceSetCacheConfig,
cudaDeviceGetSharedMemConfig,
cudaDeviceSetSharedMemConfig,
cudaDeviceGetByPCIBusId,
cudaDeviceGetPCIBusId,
cudaDeviceGetAttribute,
cudaDeviceCanAccessPeer,
cudaDeviceEnablePeerAccess,
cudaDeviceDisablePeerAccess
)


# Module
export(
cuModuleLoad,
cuModuleLoadData,
cuModuleLoadDataEx,
cuModuleLoadFatBinary,
cuModuleUnload,
cuModuleGetFunction,
cuModuleGetGlobal,
cuModuleGetTexRef,
cuModuleGetSurfRef
)

# Func
export(
cuFuncGetAttribute,
cuFuncSetCacheConfig,
cuFuncSetSharedMemConfig,
cuFuncSetBlockShape,
cuFuncSetSharedSize
)

# Event
export(
cuEventCreate,
cuEventRecord,
cuEventQuery,
cuEventSynchronize,
cuEventDestroy,
cuEventElapsedTime
)



# Other
export(
cuArrayCreate,
cuArrayGetDescriptor,
cuArrayDestroy,
cuArray3DCreate,
cuArray3DGetDescriptor,
cuPointerGetAttribute,
cuGraphicsUnregisterResource,
cuGraphicsSubResourceGetMappedArray,
cuGraphicsResourceGetMappedPointer,
cuGraphicsResourceSetMapFlags,
cuGraphicsMapResources,
cuGraphicsUnmapResources,
cudaPeekAtLastError,
cudaChooseDevice,
cudaGetDevice,
cudaSetValidDevices,
cudaSetDeviceFlags,
cudaStreamCreate,
cudaStreamCreateWithFlags,
cudaStreamDestroy,
cudaStreamWaitEvent,
cudaStreamAddCallback,
cudaStreamSynchronize,
cudaStreamQuery,
cudaEventCreate,
cudaEventCreateWithFlags,
cudaEventRecord,
cudaEventQuery,
cudaEventSynchronize,
cudaEventDestroy,
cudaEventElapsedTime,
cudaFuncSetCacheConfig,
cudaFuncSetSharedMemConfig,
cudaLaunch,
cudaFuncGetAttributes,
cudaSetDoubleForDevice,
cudaSetDoubleForHost,
cudaMallocHost,
cudaMallocPitch,
cudaMallocArray,
cudaFreeHost,
cudaFreeArray,
cudaHostAlloc,
cudaHostRegister,
cudaHostUnregister,
cudaHostGetDevicePointer,
cudaHostGetFlags,
cudaArrayGetInfo,
cudaGetSymbolAddress,
cudaGetSymbolSize,
cudaPointerGetAttributes,
cudaGraphicsUnregisterResource,
cudaGraphicsResourceSetMapFlags,
cudaGraphicsMapResources,
cudaGraphicsUnmapResources,
cudaGraphicsResourceGetMappedPointer,
cudaGraphicsSubResourceGetMappedArray,
cudaGetChannelDesc,
cudaCreateChannelDesc
)




export(CU_CTX_SCHED_AUTO, CU_CTX_SCHED_SPIN, CU_CTX_SCHED_YIELD, CU_CTX_SCHED_BLOCKING_SYNC, CU_CTX_BLOCKING_SYNC, CU_CTX_SCHED_MASK, CU_CTX_MAP_HOST, CU_CTX_LMEM_RESIZE_TO_MAX, CU_CTX_FLAGS_MASK)

export(cuFuncGetAttributes)


export(cudaMemcpy2D)

export(mallocPitch, convertToPtr)
exportMethods("[<-")

export("cudaMemcpyHostToHost",
"cudaMemcpyHostToDevice",
"cudaMemcpyDeviceToHost",
"cudaMemcpyDeviceToDevice",
"cudaMemcpyDefault")

S3method('[<-', "PitchMemory2D")









export(
cuMemGetInfo,
cuMemAlloc,
cuMemAllocPitch,
cuMemFree,
cuMemGetAddressRange,
cuMemAllocHost,
cuMemFreeHost,
cuMemHostAlloc,
cuMemHostGetDevicePointer,
cuMemHostGetFlags,
cuMemHostRegister,
cuMemHostUnregister,
cuMemcpy,
cuMemcpyPeer,
cuMemcpyHtoD,
cuMemcpyDtoH,
cuMemcpyDtoD,
cuMemcpyDtoA,
cuMemcpyAtoD,
cuMemcpyHtoA,
cuMemcpyAtoH,
cuMemcpyAtoA,
cuMemcpy2D,
cuMemcpy2DUnaligned,
cuMemcpy3D,
cuMemcpy3DPeer,
cuMemcpyAsync,
cuMemcpyPeerAsync,
cuMemcpyHtoDAsync,
cuMemcpyDtoHAsync,
cuMemcpyDtoDAsync,
cuMemcpyHtoAAsync,
cuMemcpyAtoHAsync,
cuMemcpy2DAsync,
cuMemcpy3DAsync,
cuMemcpy3DPeerAsync,
cuMemsetD8,
cuMemsetD16,
cuMemsetD32,
cuMemsetD2D8,
cuMemsetD2D16,
cuMemsetD2D32,
cuMemsetD8Async,
cuMemsetD16Async,
cuMemsetD32Async,
cuMemsetD2D8Async,
cuMemsetD2D16Async,
cuMemsetD2D32Async,
cudaMemcpy3D,
cudaMemcpy3DPeer,
cudaMemcpy3DAsync,
cudaMemcpy3DPeerAsync,
cudaMemGetInfo,
cudaMemcpy,
cudaMemcpyPeer,
cudaMemcpyToArray,
cudaMemcpyFromArray,
cudaMemcpyArrayToArray,
cudaMemcpy2D,
cudaMemcpy2DToArray,
cudaMemcpy2DFromArray,
cudaMemcpy2DArrayToArray,
cudaMemcpyToSymbol,
cudaMemcpyFromSymbol,
cudaMemcpyAsync,
cudaMemcpyPeerAsync,
cudaMemcpyToArrayAsync,
cudaMemcpyFromArrayAsync,
cudaMemcpy2DAsync,
cudaMemcpy2DToArrayAsync,
cudaMemcpy2DFromArrayAsync,
cudaMemcpyToSymbolAsync,
cudaMemcpyFromSymbolAsync,
cudaMemset,
cudaMemset2D,
cudaMemset3D,
cudaMemsetAsync,
cudaMemset2DAsync,
cudaMemset3DAsync
)


export(
cuStreamCreate,
cuStreamCreateWithPriority,
cuStreamGetPriority,
cuStreamGetFlags,
cuStreamDestroy,
cuStreamWaitEvent,
cuStreamAddCallback,
cuStreamSynchronize,
cuStreamQuery
)
