summaryrefslogtreecommitdiff
path: root/libcuda/cuda_runtime_api.cc
diff options
context:
space:
mode:
authorMengchi Zhang <[email protected]>2019-06-21 12:09:17 -0400
committerGitHub <[email protected]>2019-06-21 12:09:17 -0400
commit2f749f6969cd0582b7ac2bfe33309034185cc77c (patch)
treeb344dfc77c47d1d789ac503b0420f650c904972a /libcuda/cuda_runtime_api.cc
parentdc3c13e2d29ae296394ace75b2a4bf3a3c1da027 (diff)
parent3cac7525e1046285337e4dcf7fd8aa07c3a1f7c9 (diff)
Merge pull request #2 from purdue-aalp/dev
Dev
Diffstat (limited to 'libcuda/cuda_runtime_api.cc')
-rw-r--r--libcuda/cuda_runtime_api.cc127
1 files changed, 113 insertions, 14 deletions
diff --git a/libcuda/cuda_runtime_api.cc b/libcuda/cuda_runtime_api.cc
index 0a6eabb..61f8415 100644
--- a/libcuda/cuda_runtime_api.cc
+++ b/libcuda/cuda_runtime_api.cc
@@ -479,6 +479,8 @@ void cuda_runtime_api::cuobjdumpRegisterFatBinary(unsigned int handle, const cha
fatbinmap[handle] = filename;
}
+
+
/*******************************************************************************
* Add internal cuda runtime API call to accept gpgpu_context *
*******************************************************************************/
@@ -773,6 +775,17 @@ cudaError_t cudaLaunchInternal( const char *hostFun, gpgpu_context* gpgpu_ctx =
sscanf(mode,"%u", &g_ptx_sim_mode);
gpgpusim_ptx_assert( !ctx->api->g_cuda_launch_stack.empty(), "empty launch stack" );
kernel_config config = ctx->api->g_cuda_launch_stack.back();
+ {
+ dim3 gridDim = config.grid_dim();
+ dim3 blockDim = config.block_dim();
+ if (gridDim.x * gridDim.y * gridDim.z == 0 || blockDim.x * blockDim.y * blockDim.z == 0)
+ {
+ //can't launch
+ printf("can't launch a empty kernel\n");
+ ctx->api->g_cuda_launch_stack.pop_back();
+ return g_last_cudaError = cudaErrorInvalidConfiguration;
+ }
+ }
struct CUstream_st *stream = config.get_stream();
printf("\nGPGPU-Sim PTX: cudaLaunch for 0x%p (mode=%s) on stream %u\n", hostFun,
g_ptx_sim_mode?"functional simulation":"performance simulation", stream?stream->get_uid():0 );
@@ -1692,6 +1705,12 @@ __host__ cudaError_t CUDARTAPI cudaDeviceGetAttribute(int *value, enum cudaDevic
break;
case 88:
case 89:
+ case 90:
+ case 91:
+ case 92:
+ case 93:
+ case 94:
+ case 95:
*value= 0;
break;
default:
@@ -1977,20 +1996,21 @@ __host__ cudaError_t CUDARTAPI cudaLaunch( const char *hostFun )
__host__ cudaError_t CUDARTAPI cudaLaunchKernel ( const char* hostFun, dim3 gridDim, dim3 blockDim, const void** args, size_t sharedMem, cudaStream_t stream )
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUctx_st *context = GPGPUSim_Context();
- function_info *entry = context->get_kernel(hostFun);
-
- cudaConfigureCallInternal(gridDim, blockDim, sharedMem, stream);
- for(unsigned i = 0; i < entry->num_args(); i++){
- std::pair<size_t, unsigned> p = entry->get_param_config(i);
- cudaSetupArgumentInternal(args[i], p.first, p.second);
- }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ CUctx_st *context = GPGPUSim_Context();
+ function_info *entry = context->get_kernel(hostFun);
+#if CUDART_VERSION < 10000
+ cudaConfigureCallInternal(gridDim, blockDim, sharedMem, stream);
+#endif
+ for(unsigned i = 0; i < entry->num_args(); i++){
+ std::pair<size_t, unsigned> p = entry->get_param_config(i);
+ cudaSetupArgumentInternal(args[i], p.first, p.second);
+ }
- cudaLaunchInternal(hostFun);
- return g_last_cudaError = cudaSuccess;
+ cudaLaunchInternal(hostFun);
+ return g_last_cudaError = cudaSuccess;
}
@@ -2843,9 +2863,43 @@ extern "C" {
void** CUDARTAPI __cudaRegisterFatBinary( void *fatCubin )
{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
return cudaRegisterFatBinaryInternal(fatCubin);
}
+void CUDARTAPI __cudaRegisterFatBinaryEnd( void **fatCubinHandle )
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+}
+
+unsigned CUDARTAPI __cudaPushCallConfiguration(dim3 gridDim,
+ dim3 blockDim,
+ size_t sharedMem = 0,
+ struct CUstream_st *stream = 0)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cudaConfigureCallInternal(gridDim, blockDim, sharedMem, stream);
+}
+
+cudaError_t CUDARTAPI __cudaPopCallConfiguration(
+ dim3 *gridDim,
+ dim3 *blockDim,
+ size_t *sharedMem,
+ void *stream
+)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ return g_last_cudaError = cudaSuccess;
+}
+
void CUDARTAPI __cudaRegisterFunction(
void **fatCubinHandle,
const char *hostFun,
@@ -2902,7 +2956,6 @@ void __cudaUnregisterFatBinary(void **fatCubinHandle)
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- ;
}
cudaError_t cudaDeviceReset ( void ) {
@@ -3210,6 +3263,52 @@ __host__ cudaError_t CUDARTAPI cudaDeviceSetLimit(enum cudaLimit limit, size_t v
#endif
+
+#if CUDART_VERSION >= 9000
+/**
+ * \brief Set attributes for a given function
+ *
+ * This function sets the attributes of a function specified via \p entry.
+ * The parameter \p entry must be a pointer to a function that executes
+ * on the device. The parameter specified by \p entry must be declared as a \p __global__
+ * function. The enumeration defined by \p attr is set to the value defined by \p value
+ * If the specified function does not exist, then ::cudaErrorInvalidDeviceFunction is returned.
+ * If the specified attribute cannot be written, or if the value is incorrect,
+ * then ::cudaErrorInvalidValue is returned.
+ *
+ * Valid values for \p attr are:
+ * ::cuFuncAttrMaxDynamicSharedMem - Maximum size of dynamic shared memory per block
+ * ::cudaFuncAttributePreferredSharedMemoryCarveout - Preferred shared memory-L1 cache split ratio
+ *
+ * \param entry - Function to get attributes of
+ * \param attr - Attribute to set
+ * \param value - Value to set
+ *
+ * \return
+ * ::cudaSuccess,
+ * ::cudaErrorInitializationError,
+ * ::cudaErrorInvalidDeviceFunction,
+ * ::cudaErrorInvalidValue
+ * \notefnerr
+ *
+ * \ref ::cudaLaunchKernel(const T *func, dim3 gridDim, dim3 blockDim, void **args, size_t sharedMem, cudaStream_t stream) "cudaLaunchKernel (C++ API)",
+ * \ref ::cudaFuncSetCacheConfig(T*, enum cudaFuncCache) "cudaFuncSetCacheConfig (C++ API)",
+ * \ref ::cudaFuncGetAttributes(struct cudaFuncAttributes*, const void*) "cudaFuncGetAttributes (C API)",
+ * ::cudaSetDoubleForDevice,
+ * ::cudaSetDoubleForHost,
+ * \ref ::cudaSetupArgument(T, size_t) "cudaSetupArgument (C++ API)"
+ */
+cudaError_t CUDARTAPI cudaFuncSetAttribute(const void *func, enum cudaFuncAttribute attr, int value)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ printf("GPGPU-Sim PTX: Execution warning: ignoring call to \"%s ( func=%p, attr=%d, value=%d )\"\n",
+ __my_func__, func, attr, value );
+ return g_last_cudaError = cudaSuccess;
+}
+#endif
+
cudaError_t CUDARTAPI cudaGLSetGLDevice(int device)
{
if(g_debug_execution >= 3){