summaryrefslogtreecommitdiff
path: root/libcuda
diff options
context:
space:
mode:
authorMahmoud <[email protected]>2019-09-12 18:30:18 -0400
committerMahmoud <[email protected]>2019-09-12 18:30:18 -0400
commit5753f2236b73be3e2a1a49a55fc5c52310eba622 (patch)
treec30d62bb70f62a7930f4fa0763c219b103b622d3 /libcuda
parent6ce5e06d2389cad5041b495d5516b503ec7d2cd2 (diff)
parentbea40c4a22a86fddbf1f7845265697716727f8b1 (diff)
Merge branch 'dev' of https://github.com/purdue-aalp/gpgpu-sim_distribution into dev-traces
Diffstat (limited to 'libcuda')
-rw-r--r--libcuda/cuda_runtime_api.cc1613
-rw-r--r--libcuda/gpgpu_context.h5
2 files changed, 976 insertions, 642 deletions
diff --git a/libcuda/cuda_runtime_api.cc b/libcuda/cuda_runtime_api.cc
index e71db4c..5cefe60 100644
--- a/libcuda/cuda_runtime_api.cc
+++ b/libcuda/cuda_runtime_api.cc
@@ -150,9 +150,6 @@
#endif
-extern void synchronize();
-extern void exit_simulation();
-
/*DEVICE_BUILTIN*/
struct cudaArray
{
@@ -176,8 +173,6 @@ struct cudaArray
cudaError_t g_last_cudaError = cudaSuccess;
-//extern stream_manager *g_stream_manager();
-
void register_ptx_function( const char *name, function_info *impl )
{
// no longer need this
@@ -199,8 +194,7 @@ void register_ptx_function( const char *name, function_info *impl )
struct _cuda_device_id *gpgpu_context::GPGPUSim_Init()
{
- //static _cuda_device_id *the_device = NULL;
- _cuda_device_id *the_device = GPGPUsim_ctx_ptr()->the_cude_device;
+ _cuda_device_id *the_device = the_gpgpusim->the_cude_device;
if( !the_device ) {
gpgpu_sim *the_gpu = gpgpu_ptx_sim_init_perf();
@@ -245,22 +239,21 @@ struct _cuda_device_id *gpgpu_context::GPGPUSim_Init()
prop->maxThreadsPerMultiProcessor = the_gpu->threads_per_core();
#endif
the_gpu->set_prop(prop);
- GPGPUsim_ctx_ptr()->the_cude_device = new _cuda_device_id(the_gpu);
- the_device = GPGPUsim_ctx_ptr()->the_cude_device;
+ the_gpgpusim->the_cude_device = new _cuda_device_id(the_gpu);
+ the_device = the_gpgpusim->the_cude_device;
}
start_sim_thread(1);
return the_device;
}
-static CUctx_st* GPGPUSim_Context()
+CUctx_st* GPGPUSim_Context(gpgpu_context * ctx)
{
//static CUctx_st *the_context = NULL;
- gpgpu_context *cur_ctx = GPGPU_Context();
- CUctx_st *the_context = GPGPUsim_ctx_ptr()->the_context;
+ CUctx_st *the_context = ctx->the_gpgpusim->the_context;
if( the_context == NULL ) {
- _cuda_device_id *the_gpu = cur_ctx->GPGPUSim_Init();
- GPGPUsim_ctx_ptr()->the_context = new CUctx_st(the_gpu);
- the_context = GPGPUsim_ctx_ptr()->the_context;
+ _cuda_device_id *the_gpu = ctx->GPGPUSim_Init();
+ ctx->the_gpgpusim->the_context = new CUctx_st(the_gpu);
+ the_context = ctx->the_gpgpusim->the_context;
}
return the_context;
}
@@ -276,9 +269,9 @@ gpgpu_context* GPGPU_Context()
void ptxinfo_data::ptxinfo_addinfo()
{
+ CUctx_st *context = GPGPUSim_Context(gpgpu_ctx);
if(!get_ptxinfo_kname()){
/* This info is not per kernel (since CUDA 5.0 some info (e.g. gmem, and cmem) is added at the beginning for the whole binary ) */
- CUctx_st *context = GPGPUSim_Context();
print_ptxinfo();
context->add_ptxinfo(get_ptxinfo());
clear_ptxinfo();
@@ -289,7 +282,6 @@ gpgpu_context* GPGPU_Context()
clear_ptxinfo();
return;
}
- CUctx_st *context = GPGPUSim_Context();
print_ptxinfo();
context->add_ptxinfo( get_ptxinfo_kname(), get_ptxinfo() );
clear_ptxinfo();
@@ -548,7 +540,7 @@ __host__ cudaError_t CUDARTAPI cudaDeviceGetLimitInternal( size_t* pValue, cudaL
break;
}
else{
- printf("ERROR:Limit %s is not supported on this architecture \n",limit);
+ printf("ERROR:Limit %d is not supported on this architecture \n", limit);
abort();
}
case 4: // cudaLimitDevRuntimePendingLaunchCount
@@ -557,12 +549,12 @@ __host__ cudaError_t CUDARTAPI cudaDeviceGetLimitInternal( size_t* pValue, cudaL
break;
}
else{
- printf("ERROR:Limit %s is not supported on this architecture \n",limit);
+ printf("ERROR:Limit %d is not supported on this architecture \n",limit);
abort();
}
#endif
default:
- printf("ERROR:Limit %s unimplemented \n",limit);
+ printf("ERROR:Limit %d unimplemented \n",limit);
abort();
}
return g_last_cudaError = cudaSuccess;
@@ -585,7 +577,7 @@ void** cudaRegisterFatBinaryInternal( void *fatCubin, gpgpu_context* gpgpu_ctx =
printf("GPGPU-Sim PTX: ERROR ** this version of GPGPU-Sim requires CUDA 2.1 or higher\n");
exit(1);
#endif
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(ctx);
static unsigned next_fat_bin_handle = 1;
if(context->get_device()->get_gpgpu()->get_config().use_cuobjdump()) {
// The following workaround has only been verified on 64-bit systems.
@@ -732,7 +724,7 @@ void cudaRegisterFunctionInternal(
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(ctx);
unsigned fat_cubin_handle = (unsigned)(unsigned long long)fatCubinHandle;
printf("GPGPU-Sim PTX: __cudaRegisterFunction %s : hostFun 0x%p, fat_cubin_handle = %u\n",
deviceFun, hostFun, fat_cubin_handle);
@@ -763,7 +755,7 @@ void cudaRegisterVarInternal(
}
printf("GPGPU-Sim PTX: __cudaRegisterVar: hostVar = %p; deviceAddress = %s; deviceName = %s\n", hostVar, deviceAddress, deviceName);
printf("GPGPU-Sim PTX: __cudaRegisterVar: Registering const memory space of %d bytes\n", size);
- if(GPGPUSim_Context()->get_device()->get_gpgpu()->get_config().use_cuobjdump())
+ if(GPGPUSim_Context(ctx)->get_device()->get_gpgpu()->get_config().use_cuobjdump())
ctx->cuobjdumpParseBinary((unsigned)(unsigned long long)fatCubinHandle);
fflush(stdout);
if ( constant && !global && !ext ) {
@@ -872,7 +864,7 @@ cudaError_t cudaLaunchInternal( const char *hostFun, gpgpu_context* gpgpu_ctx =
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st* context = GPGPUSim_Context();
+ CUctx_st* context = GPGPUSim_Context(ctx);
char *mode = getenv("PTX_SIM_MODE_FUNC");
if( mode )
sscanf(mode,"%u", &(ctx->func_sim->g_ptx_sim_mode));
@@ -944,7 +936,7 @@ cudaError_t cudaLaunchInternal( const char *hostFun, gpgpu_context* gpgpu_ctx =
printf("GPGPU-Sim PTX: pushing kernel \'%s\' to stream %u, gridDim= (%u,%u,%u) blockDim = (%u,%u,%u) \n",
kname.c_str(), stream?stream->get_uid():0, gridDim.x,gridDim.y,gridDim.z,blockDim.x,blockDim.y,blockDim.z );
stream_operation op(grid,ctx->func_sim->g_ptx_sim_mode,stream);
- g_stream_manager()->push(op);
+ ctx->the_gpgpusim->g_stream_manager->push(op);
ctx->api->g_cuda_launch_stack.pop_back();
return g_last_cudaError = cudaSuccess;
}
@@ -960,7 +952,7 @@ cudaError_t cudaMallocInternal(void **devPtr, size_t size, gpgpu_context* gpgpu_
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st* context = GPGPUSim_Context();
+ CUctx_st* context = GPGPUSim_Context(ctx);
*devPtr = context->get_device()->get_gpgpu()->gpu_malloc(size);
if(g_debug_execution >= 3){
printf("GPGPU-Sim PTX: cudaMallocing %zu bytes starting at 0x%llx..\n",size, (unsigned long long) *devPtr);
@@ -994,6 +986,29 @@ cudaError_t cudaMallocHostInternal(void **ptr, size_t size, gpgpu_context* gpgpu
}
}
+__host__ cudaError_t CUDARTAPI cudaMallocPitchInternal(void **devPtr, size_t *pitch, size_t width, size_t height, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ unsigned malloc_width_inbytes = width;
+ printf("GPGPU-Sim PTX: cudaMallocPitch (width = %d)\n", malloc_width_inbytes);
+ CUctx_st* context = GPGPUSim_Context(ctx);
+ *devPtr = context->get_device()->get_gpgpu()->gpu_malloc(malloc_width_inbytes*height);
+ pitch[0] = malloc_width_inbytes;
+ if ( *devPtr ) {
+ return g_last_cudaError = cudaSuccess;
+ } else {
+ return g_last_cudaError = cudaErrorMemoryAllocation;
+ }
+}
+
cudaError_t cudaHostGetDevicePointerInternal(void **pDevice, void *pHost, unsigned int flags, gpgpu_context* gpgpu_ctx = NULL)
{
gpgpu_context *ctx;
@@ -1011,7 +1026,7 @@ cudaError_t cudaHostGetDevicePointerInternal(void **pDevice, void *pHost, unsign
//only cpu memory allocation happens in cudaHostAlloc. Linking with device pointer to pinned memory happens here.
//TODO: once kernel is executed, the contents in global pointer of GPU must be copied back to CPU host pointer!
flags=0;
- CUctx_st* context = GPGPUSim_Context();
+ CUctx_st* context = GPGPUSim_Context(ctx);
gpgpu_t *gpu = context->get_device()->get_gpgpu();
std::map<void *, size_t>::const_iterator i = ctx->api->pinned_memory_size.find(pHost);
assert(i != ctx->api->pinned_memory_size.end());
@@ -1031,7 +1046,7 @@ cudaError_t cudaHostGetDevicePointerInternal(void **pDevice, void *pHost, unsign
}
}
-cudaError_t cudaGLMapBufferObjectInternal(void** devPtr, GLuint bufferObj, gpgpu_context* gpgpu_ctx = NULL)
+__host__ cudaError_t CUDARTAPI cudaMallocArrayInternal(struct cudaArray **array, const struct cudaChannelFormatDesc *desc, size_t width, size_t height __dv(1), gpgpu_context* gpgpu_ctx = NULL)
{
gpgpu_context *ctx;
if (gpgpu_ctx){
@@ -1042,226 +1057,8 @@ cudaError_t cudaGLMapBufferObjectInternal(void** devPtr, GLuint bufferObj, gpgpu
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
-#ifdef OPENGL_SUPPORT
- GLint buffer_size=0;
- CUctx_st* context = GPGPUSim_Context();
-
- glbmap_entry_t *p = ctx->api->g_glbmap;
- while ( p && p->m_bufferObj != bufferObj )
- p = p->m_next;
- if ( p == NULL ) {
- glBindBuffer(GL_ARRAY_BUFFER,bufferObj);
- glGetBufferParameteriv(GL_ARRAY_BUFFER,GL_BUFFER_SIZE,&buffer_size);
- assert( buffer_size != 0 );
- *devPtr = context->get_device()->get_gpgpu()->gpu_malloc(buffer_size);
-
- // create entry and insert to front of list
- glbmap_entry_t *n = (glbmap_entry_t *) calloc(1,sizeof(glbmap_entry_t));
- n->m_next = ctx->api->g_glbmap;
- ctx->api->g_glbmap = n;
-
- // initialize entry
- n->m_bufferObj = bufferObj;
- n->m_devPtr = *devPtr;
- n->m_size = buffer_size;
-
- p = n;
- } else {
- buffer_size = p->m_size;
- *devPtr = p->m_devPtr;
- }
-
- if ( *devPtr ) {
- char *data = (char *) calloc(p->m_size,1);
- glGetBufferSubData(GL_ARRAY_BUFFER,0,buffer_size,data);
- memcpy_to_gpu( (size_t) *devPtr, data, buffer_size );
- free(data);
- printf("GPGPU-Sim PTX: cudaGLMapBufferObject %zu bytes starting at 0x%llx..\n", (size_t)buffer_size,
- (unsigned long long) *devPtr);
- return g_last_cudaError = cudaSuccess;
- } else {
- return g_last_cudaError = cudaErrorMemoryAllocation;
- }
-
- return g_last_cudaError = cudaSuccess;
-#else
- fflush(stdout);
- fflush(stderr);
- printf("GPGPU-Sim PTX: GPGPU-Sim support for OpenGL integration disabled -- exiting\n");
- fflush(stdout);
- exit(50);
-#endif
-}
-
-#if CUDART_VERSION >= 6050
-CUresult
-cuLinkAddFileInternal(CUlinkState state, CUjitInputType type, const char *path,
- unsigned int numOptions, CUjit_option *options, void **optionValues, gpgpu_context* gpgpu_ctx = NULL)
-{
- gpgpu_context *ctx;
- if (gpgpu_ctx){
- ctx = gpgpu_ctx;
- } else {
- ctx = GPGPU_Context();
- }
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- static bool addedFile = false;
- if (addedFile){
- printf("GPGPU-Sim PTX: ERROR: cuLinkAddFile does not support multiple files\n");
- abort();
- }
-
- //blocking
- assert(type==CU_JIT_INPUT_PTX);
- CUctx_st *context = GPGPUSim_Context();
- char *file = getenv("PTX_JIT_PATH");
- if(file==NULL){
- printf("GPGPU-Sim PTX: ERROR: PTX_JIT_PATH has not been set\n");
- abort();
- }
- strcat(file,"/");
- strcat(file,path);
- symbol_table *symtab = ctx->gpgpu_ptx_sim_load_ptx_from_filename( file );
- std::string fname(path);
- ctx->api->name_symtab[fname] = symtab;
- context->add_binary(symtab, 1);
- ctx->api->load_static_globals(symtab,STATIC_ALLOC_LIMIT,0xFFFFFFFF,context->get_device()->get_gpgpu());
- ctx->api->load_constants(symtab,STATIC_ALLOC_LIMIT,context->get_device()->get_gpgpu());
- addedFile = true;
- return CUDA_SUCCESS;
-}
-#endif
-
-#if (CUDART_VERSION >= 2010)
-
-cudaError_t cudaHostAllocInternal(void **pHost, size_t bytes, unsigned int flags, gpgpu_context* gpgpu_ctx = NULL)
-{
- gpgpu_context *ctx;
- if (gpgpu_ctx){
- ctx = gpgpu_ctx;
- } else {
- ctx = GPGPU_Context();
- }
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- *pHost = malloc(bytes);
- //need to track the size allocated so that cudaHostGetDevicePointer() can function properly.
- //TODO: vary this function behavior based on flags value (following nvidia documentation)
- ctx->api->pinned_memory_size[*pHost]=bytes;
- if( *pHost )
- return g_last_cudaError = cudaSuccess;
- else
- return g_last_cudaError = cudaErrorMemoryAllocation;
-}
-
-#endif
-
-size_t getMaxThreadsPerBlock(struct cudaFuncAttributes *attr, gpgpu_context *ctx) {
- _cuda_device_id *dev = ctx->GPGPUSim_Init();
- struct cudaDeviceProp prop;
-
- prop = *dev->get_prop();
-
- size_t max = prop.maxThreadsPerBlock;
-
- if (attr->numRegs && (prop.regsPerBlock / attr->numRegs) < max)
- max = prop.regsPerBlock / attr->numRegs;
-
- if (attr->sharedSizeBytes && (prop.sharedMemPerBlock / attr->sharedSizeBytes) < max)
- max = prop.sharedMemPerBlock / attr->sharedSizeBytes;
-
- return max;
-}
-
-cudaError_t CUDARTAPI cudaFuncGetAttributesInternal(struct cudaFuncAttributes *attr, const char *hostFun, gpgpu_context* gpgpu_ctx = NULL )
-{
- gpgpu_context *ctx;
- if (gpgpu_ctx){
- ctx = gpgpu_ctx;
- } else {
- ctx = GPGPU_Context();
- }
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUctx_st *context = GPGPUSim_Context();
- function_info *entry = context->get_kernel(hostFun);
- if( entry ) {
- const struct gpgpu_ptx_sim_info *kinfo = entry->get_kernel_info();
- attr->sharedSizeBytes = kinfo->smem;
- attr->constSizeBytes = kinfo->cmem;
- attr->localSizeBytes = kinfo->lmem;
- attr->numRegs = kinfo->regs;
- if(kinfo->maxthreads > 0)
- attr->maxThreadsPerBlock = kinfo->maxthreads;
- else
- attr->maxThreadsPerBlock = getMaxThreadsPerBlock(attr, ctx);
-#if CUDART_VERSION >= 3000
- attr->ptxVersion = kinfo->ptx_version;
- attr->binaryVersion = kinfo->sm_target;
-#endif
- }
- return g_last_cudaError = cudaSuccess;
-}
-
-
-/*******************************************************************************
- * *
- * *
- * *
- *******************************************************************************/
-
-extern "C" {
-
-/*******************************************************************************
- * *
- * *
- * *
- *******************************************************************************/
-cudaError_t cudaPeekAtLastError(void)
-{
- return g_last_cudaError;
-}
-
-__host__ cudaError_t CUDARTAPI cudaMalloc(void **devPtr, size_t size)
-{
- return cudaMallocInternal(devPtr, size);
-}
-
-__host__ cudaError_t CUDARTAPI cudaMallocHost(void **ptr, size_t size)
-{
- return cudaMallocHostInternal(ptr, size);
-}
-__host__ cudaError_t CUDARTAPI cudaMallocPitch(void **devPtr, size_t *pitch, size_t width, size_t height)
-{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- unsigned malloc_width_inbytes = width;
- printf("GPGPU-Sim PTX: cudaMallocPitch (width = %d)\n", malloc_width_inbytes);
- CUctx_st* ctx = GPGPUSim_Context();
- *devPtr = ctx->get_device()->get_gpgpu()->gpu_malloc(malloc_width_inbytes*height);
- pitch[0] = malloc_width_inbytes;
- if ( *devPtr ) {
- return g_last_cudaError = cudaSuccess;
- } else {
- return g_last_cudaError = cudaErrorMemoryAllocation;
- }
-}
-
-__host__ cudaError_t CUDARTAPI cudaMallocArray(struct cudaArray **array, const struct cudaChannelFormatDesc *desc, size_t width, size_t height __dv(1))
-{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
unsigned size = width * height * ((desc->x + desc->y + desc->z + desc->w)/8);
- CUctx_st* context = GPGPUSim_Context();
+ CUctx_st* context = GPGPUSim_Context(ctx);
(*array) = (struct cudaArray*) malloc(sizeof(struct cudaArray));
(*array)->desc = *desc;
(*array)->width = width;
@@ -1278,41 +1075,14 @@ __host__ cudaError_t CUDARTAPI cudaMallocArray(struct cudaArray **array, const s
}
}
-__host__ cudaError_t CUDARTAPI cudaFree(void *devPtr)
-{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- // TODO... manage g_global_mem space?
- return g_last_cudaError = cudaSuccess;
-}
-__host__ cudaError_t CUDARTAPI cudaFreeHost(void *ptr)
+__host__ cudaError_t CUDARTAPI cudaMemcpyInternal(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind, gpgpu_context* gpgpu_ctx = NULL)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
}
- free (ptr); // this will crash the system if called twice
- return g_last_cudaError = cudaSuccess;
-}
-
-__host__ cudaError_t CUDARTAPI cudaFreeArray(struct cudaArray *array)
-{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- // TODO... manage g_global_mem space?
- return g_last_cudaError = cudaSuccess;
-};
-
-
-/*******************************************************************************
- * *
- * *
- * *
- *******************************************************************************/
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind)
-{
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
@@ -1321,21 +1091,21 @@ __host__ cudaError_t CUDARTAPI cudaMemcpy(void *dst, const void *src, size_t cou
if(g_debug_execution >= 3)
printf("GPGPU-Sim PTX: cudaMemcpy(): devPtr = %p\n", dst);
if( kind == cudaMemcpyHostToDevice )
- g_stream_manager()->push( stream_operation(src,(size_t)dst,count,0) );
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation(src,(size_t)dst,count,0) );
else if( kind == cudaMemcpyDeviceToHost )
- g_stream_manager()->push( stream_operation((size_t)src,dst,count,0) );
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation((size_t)src,dst,count,0) );
else if( kind == cudaMemcpyDeviceToDevice )
- g_stream_manager()->push( stream_operation((size_t)src,(size_t)dst,count,0) );
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation((size_t)src,(size_t)dst,count,0) );
else if ( kind == cudaMemcpyDefault ) {
if ((size_t)src >= GLOBAL_HEAP_START) {
if ((size_t)dst >= GLOBAL_HEAP_START)
- g_stream_manager()->push( stream_operation((size_t)src,(size_t)dst,count,0) ); // device to device
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation((size_t)src,(size_t)dst,count,0) ); // device to device
else
- g_stream_manager()->push( stream_operation((size_t)src,dst,count,0) ); // device to host
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation((size_t)src,dst,count,0) ); // device to host
}
else {
if ((size_t)dst >= GLOBAL_HEAP_START)
- g_stream_manager()->push( stream_operation(src,(size_t)dst,count,0) );
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation(src,(size_t)dst,count,0) );
else {
printf("GPGPU-Sim PTX: cudaMemcpy - ERROR : unsupported transfer: host to host\n");
abort();
@@ -1349,12 +1119,18 @@ __host__ cudaError_t CUDARTAPI cudaMemcpy(void *dst, const void *src, size_t cou
return g_last_cudaError = cudaSuccess;
}
-__host__ cudaError_t CUDARTAPI cudaMemcpyToArray(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t count, enum cudaMemcpyKind kind)
+__host__ cudaError_t CUDARTAPI cudaMemcpyToArrayInternal(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t count, enum cudaMemcpyKind kind, gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(ctx);
gpgpu_t *gpu = context->get_device()->get_gpgpu();
size_t size = count;
printf("GPGPU-Sim PTX: cudaMemcpyToArray\n");
@@ -1372,33 +1148,18 @@ __host__ cudaError_t CUDARTAPI cudaMemcpyToArray(struct cudaArray *dst, size_t w
return g_last_cudaError = cudaSuccess;
}
-
-__host__ cudaError_t CUDARTAPI cudaMemcpyFromArray(void *dst, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t count, enum cudaMemcpyKind kind)
-{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
-}
-
-
-__host__ cudaError_t CUDARTAPI cudaMemcpyArrayToArray(struct cudaArray *dst, size_t wOffsetDst, size_t hOffsetDst, const struct cudaArray *src, size_t wOffsetSrc, size_t hOffsetSrc, size_t count, enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToDevice))
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DInternal(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind, gpgpu_context* gpgpu_ctx = NULL)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
-}
-
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy2D(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind)
-{
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(ctx);
gpgpu_t *gpu = context->get_device()->get_gpgpu();
size_t size = spitch*height;
gpgpusim_ptx_assert( (dpitch==spitch), "different src and dst pitch not supported yet" );
@@ -1415,13 +1176,18 @@ __host__ cudaError_t CUDARTAPI cudaMemcpy2D(void *dst, size_t dpitch, const void
return g_last_cudaError = cudaSuccess;
}
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy2DToArray(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind)
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DToArrayInternal(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind, gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(ctx);
gpgpu_t *gpu = context->get_device()->get_gpgpu();
size_t size = spitch*height;
size_t channel_size = dst->desc.w+dst->desc.x+dst->desc.y+dst->desc.z;
@@ -1447,29 +1213,14 @@ __host__ cudaError_t CUDARTAPI cudaMemcpy2DToArray(struct cudaArray *dst, size_t
return g_last_cudaError = cudaSuccess;
}
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy2DFromArray(void *dst, size_t dpitch, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t width, size_t height, enum cudaMemcpyKind kind)
-{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
-}
-
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy2DArrayToArray(struct cudaArray *dst, size_t wOffsetDst, size_t hOffsetDst, const struct cudaArray *src, size_t wOffsetSrc, size_t hOffsetSrc, size_t width, size_t height, enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToDevice))
+__host__ cudaError_t CUDARTAPI cudaMemcpyToSymbolInternal(const char *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice), gpgpu_context* gpgpu_ctx = NULL)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
-}
-
-
-__host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const char *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice))
-{
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
@@ -1477,52 +1228,47 @@ __host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const char *symbol, const void
assert(kind == cudaMemcpyHostToDevice);
printf("GPGPU-Sim PTX: cudaMemcpyToSymbol: symbol = %p\n", symbol);
//stream_operation( const char *symbol, const void *src, size_t count, size_t offset )
- g_stream_manager()->push( stream_operation(src,symbol,count,offset,0) );
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation(src,symbol,count,offset,0) );
//gpgpu_ptx_sim_memcpy_symbol(symbol,src,count,offset,1,context->get_device()->get_gpgpu());
return g_last_cudaError = cudaSuccess;
}
-__host__ cudaError_t CUDARTAPI cudaMemcpyFromSymbol(void *dst, const char *symbol, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToHost))
+__host__ cudaError_t CUDARTAPI cudaMemcpyFromSymbolInternal(void *dst, const char *symbol, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToHost), gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
//CUctx_st *context = GPGPUSim_Context();
assert(kind == cudaMemcpyDeviceToHost);
printf("GPGPU-Sim PTX: cudaMemcpyFromSymbol: symbol = %p\n", symbol);
- g_stream_manager()->push( stream_operation(symbol,dst,count,offset,0) );
+ ctx->the_gpgpusim->g_stream_manager->push( stream_operation(symbol,dst,count,offset,0) );
//gpgpu_ptx_sim_memcpy_symbol(symbol,dst,count,offset,0,context->get_device()->get_gpgpu());
return g_last_cudaError = cudaSuccess;
}
-__host__ cudaError_t CUDARTAPI cudaMemGetInfo (size_t *free, size_t *total){
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- //placeholder; should interact with cudaMalloc and cudaFree?
- *free = 10000000000;
- *total = 10000000000;
-
- return g_last_cudaError = cudaSuccess;
-}
-
-/*******************************************************************************
- * *
- * *
- * *
- *******************************************************************************/
-
-__host__ cudaError_t CUDARTAPI cudaMemcpyAsync(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream)
+__host__ cudaError_t CUDARTAPI cudaMemcpyAsyncInternal(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream, gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
struct CUstream_st *s = (struct CUstream_st *)stream;
switch( kind ) {
- case cudaMemcpyHostToDevice: g_stream_manager()->push( stream_operation(src,(size_t)dst,count,s) ); break;
- case cudaMemcpyDeviceToHost: g_stream_manager()->push( stream_operation((size_t)src,dst,count,s) ); break;
- case cudaMemcpyDeviceToDevice: g_stream_manager()->push( stream_operation((size_t)src,(size_t)dst,count,s) ); break;
+ case cudaMemcpyHostToDevice: ctx->the_gpgpusim->g_stream_manager->push( stream_operation(src,(size_t)dst,count,s) ); break;
+ case cudaMemcpyDeviceToHost: ctx->the_gpgpusim->g_stream_manager->push( stream_operation((size_t)src,dst,count,s) ); break;
+ case cudaMemcpyDeviceToDevice: ctx->the_gpgpusim->g_stream_manager->push( stream_operation((size_t)src,(size_t)dst,count,s) ); break;
default:
abort();
}
@@ -1530,98 +1276,249 @@ __host__ cudaError_t CUDARTAPI cudaMemcpyAsync(void *dst, const void *src, size_
}
-__host__ cudaError_t CUDARTAPI cudaMemcpyToArrayAsync(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream)
+#if (CUDART_VERSION >= 8000)
+cudaError_t CUDARTAPI cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlagsInternal(int* numBlocks, const char *hostFunc, int blockSize, size_t dynamicSMemSize, unsigned int flags, gpgpu_context* gpgpu_ctx = NULL)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
+ printf("GPGPU-Sim PTX: cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags %p\n", hostFunc);
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ function_info *entry = context->get_kernel(hostFunc);
+ printf("Calculate Maxium Active Block with function ptr=%p, blockSize=%d, SMemSize=%d\n", hostFunc, blockSize, dynamicSMemSize);
+ if (flags == cudaOccupancyDefault) {
+ //create kernel_info based on entry
+ dim3 gridDim(context->get_device()->get_gpgpu()->max_cta_per_core()
+ * context->get_device()->get_gpgpu()->get_config().num_shader());
+ dim3 blockDim(blockSize);
+ kernel_info_t result(gridDim, blockDim, entry);
+ //if(entry == NULL){
+ // *numBlocks = 1;
+ // return g_last_cudaError = cudaErrorUnknown;
+ //}
+ *numBlocks = context->get_device()->get_gpgpu()->get_max_cta(result);
+ printf("Maximum size is %d with gridDim %d and blockDim %d\n", *numBlocks, gridDim.x, blockDim.x);
+ return g_last_cudaError = cudaSuccess;
+ } else {
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+ }
}
+#endif
-__host__ cudaError_t CUDARTAPI cudaMemcpyFromArrayAsync(void *dst, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream)
+__host__ cudaError_t CUDARTAPI cudaMemsetInternal(void *mem, int c, size_t count, gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ gpgpu_t *gpu = context->get_device()->get_gpgpu();
+ gpu->gpu_memset((size_t)mem, c, count);
+ return g_last_cudaError = cudaSuccess;
}
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy2DAsync(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind, cudaStream_t stream)
+//memset operation is done but i think its not async?
+__host__ cudaError_t CUDARTAPI cudaMemsetAsyncInternal(void *mem, int c, size_t count, cudaStream_t stream=0, gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
+ printf("GPGPU-Sim PTX: WARNING: Asynchronous memset not supported (%s)\n", __my_func__);
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ gpgpu_t *gpu = context->get_device()->get_gpgpu();
+ gpu->gpu_memset((size_t)mem, c, count);
+ return g_last_cudaError = cudaSuccess;
}
-
-__host__ cudaError_t CUDARTAPI cudaMemcpy2DToArrayAsync(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind, cudaStream_t stream)
+cudaError_t cudaGLMapBufferObjectInternal(void** devPtr, GLuint bufferObj, gpgpu_context* gpgpu_ctx = NULL)
{
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
-}
+#ifdef OPENGL_SUPPORT
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ GLint buffer_size=0;
+ CUctx_st* context = GPGPUSim_Context(ctx);
+
+ glbmap_entry_t *p = ctx->api->g_glbmap;
+ while ( p && p->m_bufferObj != bufferObj )
+ p = p->m_next;
+ if ( p == NULL ) {
+ glBindBuffer(GL_ARRAY_BUFFER,bufferObj);
+ glGetBufferParameteriv(GL_ARRAY_BUFFER,GL_BUFFER_SIZE,&buffer_size);
+ assert( buffer_size != 0 );
+ *devPtr = context->get_device()->get_gpgpu()->gpu_malloc(buffer_size);
+ // create entry and insert to front of list
+ glbmap_entry_t *n = (glbmap_entry_t *) calloc(1,sizeof(glbmap_entry_t));
+ n->m_next = ctx->api->g_glbmap;
+ ctx->api->g_glbmap = n;
-__host__ cudaError_t CUDARTAPI cudaMemcpy2DFromArrayAsync(void *dst, size_t dpitch, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t width, size_t height, enum cudaMemcpyKind kind, cudaStream_t stream)
+ // initialize entry
+ n->m_bufferObj = bufferObj;
+ n->m_devPtr = *devPtr;
+ n->m_size = buffer_size;
+
+ p = n;
+ } else {
+ buffer_size = p->m_size;
+ *devPtr = p->m_devPtr;
+ }
+
+ if ( *devPtr ) {
+ char *data = (char *) calloc(p->m_size,1);
+ glGetBufferSubData(GL_ARRAY_BUFFER,0,buffer_size,data);
+ memcpy_to_gpu( (size_t) *devPtr, data, buffer_size );
+ free(data);
+ printf("GPGPU-Sim PTX: cudaGLMapBufferObject %zu bytes starting at 0x%llx..\n", (size_t)buffer_size,
+ (unsigned long long) *devPtr);
+ return g_last_cudaError = cudaSuccess;
+ } else {
+ return g_last_cudaError = cudaErrorMemoryAllocation;
+ }
+
+ return g_last_cudaError = cudaSuccess;
+#else
+ fflush(stdout);
+ fflush(stderr);
+ printf("GPGPU-Sim PTX: GPGPU-Sim support for OpenGL integration disabled -- exiting\n");
+ fflush(stdout);
+ exit(50);
+#endif
+}
+
+#if CUDART_VERSION >= 6050
+CUresult
+cuLinkAddFileInternal(CUlinkState state, CUjitInputType type, const char *path,
+ unsigned int numOptions, CUjit_option *options, void **optionValues, gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
+ static bool addedFile = false;
+ if (addedFile){
+ printf("GPGPU-Sim PTX: ERROR: cuLinkAddFile does not support multiple files\n");
+ abort();
+ }
+
+ //blocking
+ assert(type==CU_JIT_INPUT_PTX);
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ char *file = getenv("PTX_JIT_PATH");
+ if(file==NULL){
+ printf("GPGPU-Sim PTX: ERROR: PTX_JIT_PATH has not been set\n");
+ abort();
+ }
+ strcat(file,"/");
+ strcat(file,path);
+ symbol_table *symtab = ctx->gpgpu_ptx_sim_load_ptx_from_filename( file );
+ std::string fname(path);
+ ctx->api->name_symtab[fname] = symtab;
+ context->add_binary(symtab, 1);
+ ctx->api->load_static_globals(symtab,STATIC_ALLOC_LIMIT,0xFFFFFFFF,context->get_device()->get_gpgpu());
+ ctx->api->load_constants(symtab,STATIC_ALLOC_LIMIT,context->get_device()->get_gpgpu());
+ addedFile = true;
+ return CUDA_SUCCESS;
}
+#endif
-#if (CUDART_VERSION >= 8000)
-cudaError_t CUDARTAPI cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(int* numBlocks, const char *hostFunc, int blockSize, size_t dynamicSMemSize, unsigned int flags)
+#if (CUDART_VERSION >= 2010)
+
+cudaError_t cudaHostAllocInternal(void **pHost, size_t bytes, unsigned int flags, gpgpu_context* gpgpu_ctx = NULL)
{
- printf("GPGPU-Sim PTX: cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags %p\n", hostFunc);
- CUctx_st *context = GPGPUSim_Context();
- function_info *entry = context->get_kernel(hostFunc);
- printf("Calculate Maxium Active Block with function ptr=%p, blockSize=%d, SMemSize=%d\n", hostFunc, blockSize, dynamicSMemSize);
- if (flags == cudaOccupancyDefault) {
- //create kernel_info based on entry
- dim3 gridDim(context->get_device()->get_gpgpu()->max_cta_per_core()
- * context->get_device()->get_gpgpu()->get_config().num_shader());
- dim3 blockDim(blockSize);
- kernel_info_t result(gridDim, blockDim, entry);
- //if(entry == NULL){
- // *numBlocks = 1;
- // return g_last_cudaError = cudaErrorUnknown;
- //}
- *numBlocks = context->get_device()->get_gpgpu()->get_max_cta(result);
- printf("Maximum size is %d with gridDim %d and blockDim %d\n", *numBlocks, gridDim.x, blockDim.x);
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ *pHost = malloc(bytes);
+ //need to track the size allocated so that cudaHostGetDevicePointer() can function properly.
+ //TODO: vary this function behavior based on flags value (following nvidia documentation)
+ ctx->api->pinned_memory_size[*pHost]=bytes;
+ if( *pHost )
return g_last_cudaError = cudaSuccess;
- } else {
- cuda_not_implemented(__my_func__,__LINE__);
- return g_last_cudaError = cudaErrorUnknown;
- }
+ else
+ return g_last_cudaError = cudaErrorMemoryAllocation;
}
#endif
+size_t getMaxThreadsPerBlock(struct cudaFuncAttributes *attr, gpgpu_context *ctx) {
+ _cuda_device_id *dev = ctx->GPGPUSim_Init();
+ struct cudaDeviceProp prop;
+ prop = *dev->get_prop();
-/*******************************************************************************
- * *
- * *
- * *
- *******************************************************************************/
-__host__ cudaError_t CUDARTAPI cudaMemset(void *mem, int c, size_t count)
+ size_t max = prop.maxThreadsPerBlock;
+
+ if (attr->numRegs && (prop.regsPerBlock / attr->numRegs) < max)
+ max = prop.regsPerBlock / attr->numRegs;
+
+ if (attr->sharedSizeBytes && (prop.sharedMemPerBlock / attr->sharedSizeBytes) < max)
+ max = prop.sharedMemPerBlock / attr->sharedSizeBytes;
+
+ return max;
+}
+
+cudaError_t CUDARTAPI cudaFuncGetAttributesInternal(struct cudaFuncAttributes *attr, const char *hostFun, gpgpu_context* gpgpu_ctx = NULL )
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- CUctx_st *context = GPGPUSim_Context();
- gpgpu_t *gpu = context->get_device()->get_gpgpu();
- gpu->gpu_memset((size_t)mem, c, count);
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ function_info *entry = context->get_kernel(hostFun);
+ if( entry ) {
+ const struct gpgpu_ptx_sim_info *kinfo = entry->get_kernel_info();
+ attr->sharedSizeBytes = kinfo->smem;
+ attr->constSizeBytes = kinfo->cmem;
+ attr->localSizeBytes = kinfo->lmem;
+ attr->numRegs = kinfo->regs;
+ if(kinfo->maxthreads > 0)
+ attr->maxThreadsPerBlock = kinfo->maxthreads;
+ else
+ attr->maxThreadsPerBlock = getMaxThreadsPerBlock(attr, ctx);
+#if CUDART_VERSION >= 3000
+ attr->ptxVersion = kinfo->ptx_version;
+ attr->binaryVersion = kinfo->sm_target;
+#endif
+ }
return g_last_cudaError = cudaSuccess;
}
@@ -1826,19 +1723,652 @@ __host__ cudaError_t CUDARTAPI cudaDeviceGetAttributeInternal(int *value, enum c
}
#endif
-//memset operation is done but i think its not async?
-__host__ cudaError_t CUDARTAPI cudaMemsetAsync(void *mem, int c, size_t count, cudaStream_t stream=0)
+__host__ cudaError_t CUDARTAPI cudaBindTextureInternal(size_t *offset,
+ const struct textureReference *texref,
+ const void *devPtr,
+ const struct cudaChannelFormatDesc *desc,
+ size_t size __dv(UINT_MAX),
+ gpgpu_context* gpgpu_ctx = NULL)
{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
if(g_debug_execution >= 3){
announce_call(__my_func__);
}
- printf("GPGPU-Sim PTX: WARNING: Asynchronous memset not supported (%s)\n", __my_func__);
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(ctx);
gpgpu_t *gpu = context->get_device()->get_gpgpu();
- gpu->gpu_memset((size_t)mem, c, count);
+ printf("GPGPU-Sim PTX: in cudaBindTexture: sizeof(struct textureReference) = %zu\n", sizeof(struct textureReference));
+ struct cudaArray *array;
+ array = (struct cudaArray*) malloc(sizeof(struct cudaArray));
+ array->desc = *desc;
+ array->size = size;
+ array->width = size;
+ array->height = 1;
+ array->dimensions = 1;
+ array->devPtr = (void*)devPtr;
+ array->devPtr32 = (int)(long long)devPtr;
+ offset = 0;
+ printf("GPGPU-Sim PTX: size = %zu\n", size);
+ printf("GPGPU-Sim PTX: texref = %p, array = %p\n", texref, array);
+ printf("GPGPU-Sim PTX: devPtr32 = %x\n", array->devPtr32);
+ printf("GPGPU-Sim PTX: Name corresponding to textureReference: %s\n", gpu->gpgpu_ptx_sim_findNamefromTexture(texref));
+ printf("GPGPU-Sim PTX: ChannelFormatDesc: x=%d, y=%d, z=%d, w=%d\n", desc->x, desc->y, desc->z, desc->w);
+ printf("GPGPU-Sim PTX: Texture Normalized? = %d\n", texref->normalized);
+ gpu->gpgpu_ptx_sim_bindTextureToArray(texref, array);
+ devPtr = (void*)(long long)array->devPtr32;
+ printf("GPGPU-Sim PTX: devPtr = %p\n", devPtr);
return g_last_cudaError = cudaSuccess;
}
+__host__ cudaError_t CUDARTAPI cudaBindTextureToArrayInternal(const struct textureReference *texref, const struct cudaArray *array, const struct cudaChannelFormatDesc *desc, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ gpgpu_t *gpu = context->get_device()->get_gpgpu();
+ printf("GPGPU-Sim PTX: in cudaBindTextureToArray: %p %p\n", texref, array);
+ printf("GPGPU-Sim PTX: devPtr32 = %x\n", array->devPtr32);
+ printf("GPGPU-Sim PTX: Name corresponding to textureReference: %s\n", gpu->gpgpu_ptx_sim_findNamefromTexture(texref));
+ printf("GPGPU-Sim PTX: Texture Normalized? = %d\n", texref->normalized);
+ gpu->gpgpu_ptx_sim_bindTextureToArray(texref, array);
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaUnbindTextureInternal(const struct textureReference *texref, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ gpgpu_t *gpu = context->get_device()->get_gpgpu();
+ printf("GPGPU-Sim PTX: in cudaUnbindTexture: sizeof(struct textureReference) = %zu\n", sizeof(struct textureReference));
+ printf("GPGPU-Sim PTX: Name corresponding to textureReference: %s\n", gpu->gpgpu_ptx_sim_findNamefromTexture(texref));
+
+ gpu->gpgpu_ptx_sim_unbindTexture(texref);
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaLaunchKernelInternal( const char* hostFun, dim3 gridDim, dim3 blockDim, const void** args, size_t sharedMem, cudaStream_t stream, gpgpu_context* gpgpu_ctx = NULL )
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ function_info *entry = context->get_kernel(hostFun);
+#if CUDART_VERSION < 10000
+ cudaConfigureCallInternal(gridDim, blockDim, sharedMem, stream, ctx);
+#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;
+}
+
+__host__ cudaError_t CUDARTAPI cudaStreamCreateInternal(cudaStream_t *stream, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ printf("GPGPU-Sim PTX: cudaStreamCreate\n");
+#if (CUDART_VERSION >= 3000)
+ *stream = new struct CUstream_st();
+ ctx->the_gpgpusim->g_stream_manager->add_stream(*stream);
+#else
+ *stream = 0;
+ printf("GPGPU-Sim PTX: WARNING: Asynchronous kernel execution not supported (%s)\n", __my_func__);
+#endif
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaStreamDestroyInternal(cudaStream_t stream, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+#if (CUDART_VERSION >= 3000)
+ //per-stream synchronization required for application using external libraries without explicit synchronization in the code to
+ //avoid the stream_manager from spinning forever to destroy non-empty streams without making any forward progress.
+ stream->synchronize();
+ ctx->the_gpgpusim->g_stream_manager->destroy_stream(stream);
+#endif
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaStreamSynchronizeInternal(cudaStream_t stream, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+#if (CUDART_VERSION >= 3000)
+ if( stream == NULL )
+ ctx->synchronize();
+ return g_last_cudaError = cudaSuccess;
+ stream->synchronize();
+#else
+ printf("GPGPU-Sim PTX: WARNING: Asynchronous kernel execution not supported (%s)\n", __my_func__);
+#endif
+ return g_last_cudaError = cudaSuccess;
+}
+
+void __cudaRegisterTextureInternal(
+ void **fatCubinHandle,
+ const struct textureReference *hostVar,
+ const void **deviceAddress,
+ const char *deviceName,
+ int dim,
+ int norm,
+ int ext,
+ gpgpu_context* gpgpu_ctx = NULL
+) //passes in a newly created textureReference
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ std::string devStr (deviceName);
+ #if (CUDART_VERSION > 4020)
+ if (devStr.size() > 2 && devStr.data()[0] == ':' && devStr.data()[1] == ':')
+ devStr = devStr.replace(0, 2, "");
+ #endif
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ gpgpu_t *gpu = context->get_device()->get_gpgpu();
+ printf("GPGPU-Sim PTX: in __cudaRegisterTexture:\n");
+ gpu->gpgpu_ptx_sim_bindNameToTexture(devStr.data(), hostVar, dim, norm, ext);
+ printf("GPGPU-Sim PTX: int dim = %d\n", dim);
+ printf("GPGPU-Sim PTX: int norm = %d\n", norm);
+ printf("GPGPU-Sim PTX: int ext = %d\n", ext);
+ printf("GPGPU-Sim PTX: Execution warning: Not finished implementing \"%s\"\n", __my_func__ );
+}
+
+cudaError_t cudaGLUnmapBufferObjectInternal(GLuint bufferObj, gpgpu_context* gpgpu_ctx = NULL)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+#ifdef OPENGL_SUPPORT
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ CUctx_st* ctx = GPGPUSim_Context(ctx);
+ glbmap_entry_t *p = ctx->api->g_glbmap;
+ while ( p && p->m_bufferObj != bufferObj )
+ p = p->m_next;
+ if ( p == NULL )
+ return g_last_cudaError = cudaErrorUnknown;
+
+ char *data = (char *) calloc(p->m_size,1);
+ memcpy_from_gpu( data,(size_t)p->m_devPtr,p->m_size );
+ glBufferSubData(GL_ARRAY_BUFFER,0,p->m_size,data);
+ free(data);
+
+ return g_last_cudaError = cudaSuccess;
+#else
+ fflush(stdout);
+ fflush(stderr);
+ printf("GPGPU-Sim PTX: support for OpenGL integration disabled -- exiting\n");
+ fflush(stdout);
+ exit(50);
+#endif
+}
+
+#if CUDART_VERSION >= 3000
+
+__host__ cudaError_t CUDARTAPI cudaFuncSetCacheConfigInternal(const char *func, enum cudaFuncCache cacheConfig, gpgpu_context* gpgpu_ctx = NULL )
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ context->get_device()->get_gpgpu()->set_cache_config(context->get_kernel(func)->get_name(), (FuncCache)cacheConfig);
+ return g_last_cudaError = cudaSuccess;
+}
+
+#endif
+
+#if CUDART_VERSION >= 4000
+CUresult CUDAAPI cuLaunchKernelInternal(CUfunction f,
+ unsigned int gridDimX,
+ unsigned int gridDimY,
+ unsigned int gridDimZ,
+ unsigned int blockDimX,
+ unsigned int blockDimY,
+ unsigned int blockDimZ,
+ unsigned int sharedMemBytes,
+ CUstream hStream,
+ void **kernelParams,
+ void **extra,
+ gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ if (extra!=NULL){
+ printf("GPGPU-Sim CUDA DRIVER API: ERROR: Currently do not support void** extra.\n");
+ abort();
+ }
+ const char *hostFun = (const char*) f;
+ CUctx_st *context = GPGPUSim_Context(ctx);
+ function_info *entry = context->get_kernel(hostFun);
+ cudaConfigureCallInternal(dim3(gridDimX, gridDimY, gridDimZ), dim3(blockDimX, blockDimY, blockDimZ), sharedMemBytes, (cudaStream_t) hStream, ctx);
+ for(unsigned i = 0; i < entry->num_args(); i++){
+ std::pair<size_t, unsigned> p = entry->get_param_config(i);
+ cudaSetupArgumentInternal(kernelParams[i], p.first, p.second, ctx);
+ }
+ cudaLaunchInternal(hostFun, ctx);
+ return CUDA_SUCCESS;
+}
+#endif /* CUDART_VERSION >= 4000 */
+
+CUevent_st *get_event(cudaEvent_t event)
+{
+ unsigned event_uid;
+#if CUDART_VERSION >= 3000
+ event_uid = event->get_uid();
+#else
+ event_uid = event;
+#endif
+ event_tracker_t::iterator e = g_timer_events.find(event_uid);
+ if( e == g_timer_events.end() )
+ return NULL;
+ return e->second;
+}
+
+__host__ cudaError_t CUDARTAPI cudaEventRecordInternal(cudaEvent_t event, cudaStream_t stream, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ CUevent_st *e = get_event(event);
+ if( !e ) return g_last_cudaError = cudaErrorUnknown;
+ struct CUstream_st *s = (struct CUstream_st *)stream;
+ stream_operation op(e,s);
+ ctx->the_gpgpusim->g_stream_manager->push(op);
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaStreamWaitEventInternal(cudaStream_t stream, cudaEvent_t event, unsigned int flags, gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ //reference: https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/html/group__CUDART__STREAM_gfe68d207dc965685d92d3f03d77b0876.html
+ CUevent_st *e = get_event(event);
+ if( !e ){
+ printf("GPGPU-Sim API: Warning: cudaEventRecord has not been called on event before calling cudaStreamWaitEvent.\nNothing to be done.\n");
+ return g_last_cudaError = cudaSuccess;
+ }
+ if (!stream){
+ ctx->the_gpgpusim->g_stream_manager->pushCudaStreamWaitEventToAllStreams(e, flags);
+ } else {
+ struct CUstream_st *s = (struct CUstream_st *)stream;
+ stream_operation op(s,e,flags);
+ ctx->the_gpgpusim->g_stream_manager->push(op);
+ }
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaThreadExitInternal(gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ ctx->exit_simulation();
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaThreadSynchronizeInternal(gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ //Called on host side
+ ctx->synchronize();
+ return g_last_cudaError = cudaSuccess;
+}
+
+cudaError_t CUDARTAPI cudaDeviceSynchronizeInternal(gpgpu_context* gpgpu_ctx = NULL)
+{
+ gpgpu_context *ctx;
+ if (gpgpu_ctx){
+ ctx = gpgpu_ctx;
+ } else {
+ ctx = GPGPU_Context();
+ }
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ //Blocks until the device has completed all preceding requested tasks
+ ctx->synchronize();
+ return g_last_cudaError = cudaSuccess;
+}
+
+/*******************************************************************************
+ * *
+ * *
+ * *
+ *******************************************************************************/
+
+extern "C" {
+
+/*******************************************************************************
+ * *
+ * *
+ * *
+ *******************************************************************************/
+cudaError_t cudaPeekAtLastError(void)
+{
+ return g_last_cudaError;
+}
+
+__host__ cudaError_t CUDARTAPI cudaMalloc(void **devPtr, size_t size)
+{
+ return cudaMallocInternal(devPtr, size);
+}
+
+__host__ cudaError_t CUDARTAPI cudaMallocHost(void **ptr, size_t size)
+{
+ return cudaMallocHostInternal(ptr, size);
+}
+__host__ cudaError_t CUDARTAPI cudaMallocPitch(void **devPtr, size_t *pitch, size_t width, size_t height)
+{
+ return cudaMallocPitchInternal(devPtr, pitch, width, height);
+}
+
+__host__ cudaError_t CUDARTAPI cudaMallocArray(struct cudaArray **array, const struct cudaChannelFormatDesc *desc, size_t width, size_t height __dv(1))
+{
+ return cudaMallocArrayInternal(array, desc, width, height);
+}
+
+__host__ cudaError_t CUDARTAPI cudaFree(void *devPtr)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ // TODO... manage g_global_mem space?
+ return g_last_cudaError = cudaSuccess;
+}
+__host__ cudaError_t CUDARTAPI cudaFreeHost(void *ptr)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ free (ptr); // this will crash the system if called twice
+ return g_last_cudaError = cudaSuccess;
+}
+
+__host__ cudaError_t CUDARTAPI cudaFreeArray(struct cudaArray *array)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ // TODO... manage g_global_mem space?
+ return g_last_cudaError = cudaSuccess;
+};
+
+
+/*******************************************************************************
+ * *
+ * *
+ * *
+ *******************************************************************************/
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind)
+{
+ return cudaMemcpyInternal(dst, src, count, kind);
+}
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyToArray(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t count, enum cudaMemcpyKind kind)
+{
+ return cudaMemcpyToArrayInternal(dst, wOffset, hOffset, src, count, kind);
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyFromArray(void *dst, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t count, enum cudaMemcpyKind kind)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyArrayToArray(struct cudaArray *dst, size_t wOffsetDst, size_t hOffsetDst, const struct cudaArray *src, size_t wOffsetSrc, size_t hOffsetSrc, size_t count, enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToDevice))
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2D(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind)
+{
+ return cudaMemcpy2DInternal(dst, dpitch, src, spitch, width, height, kind);
+}
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DToArray(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind)
+{
+ return cudaMemcpy2DToArrayInternal(dst, wOffset, hOffset, src, spitch, width, height, kind);
+}
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DFromArray(void *dst, size_t dpitch, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t width, size_t height, enum cudaMemcpyKind kind)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DArrayToArray(struct cudaArray *dst, size_t wOffsetDst, size_t hOffsetDst, const struct cudaArray *src, size_t wOffsetSrc, size_t hOffsetSrc, size_t width, size_t height, enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToDevice))
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const char *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice))
+{
+ return cudaMemcpyToSymbolInternal(symbol, src, count, offset, kind);
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyFromSymbol(void *dst, const char *symbol, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyDeviceToHost))
+{
+ return cudaMemcpyFromSymbolInternal(dst, symbol, count, offset, kind);
+}
+
+__host__ cudaError_t CUDARTAPI cudaMemGetInfo (size_t *free, size_t *total){
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ //placeholder; should interact with cudaMalloc and cudaFree?
+ *free = 10000000000;
+ *total = 10000000000;
+
+ return g_last_cudaError = cudaSuccess;
+}
+
+/*******************************************************************************
+ * *
+ * *
+ * *
+ *******************************************************************************/
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyAsync(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream)
+{
+ return cudaMemcpyAsyncInternal(dst, src, count, kind, stream);
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyToArrayAsync(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpyFromArrayAsync(void *dst, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DAsync(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind, cudaStream_t stream)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DToArrayAsync(struct cudaArray *dst, size_t wOffset, size_t hOffset, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind, cudaStream_t stream)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+
+__host__ cudaError_t CUDARTAPI cudaMemcpy2DFromArrayAsync(void *dst, size_t dpitch, const struct cudaArray *src, size_t wOffset, size_t hOffset, size_t width, size_t height, enum cudaMemcpyKind kind, cudaStream_t stream)
+{
+ if(g_debug_execution >= 3){
+ announce_call(__my_func__);
+ }
+ cuda_not_implemented(__my_func__,__LINE__);
+ return g_last_cudaError = cudaErrorUnknown;
+}
+
+#if (CUDART_VERSION >= 8000)
+cudaError_t CUDARTAPI cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(int* numBlocks, const char *hostFunc, int blockSize, size_t dynamicSMemSize, unsigned int flags)
+{
+ return cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlagsInternal(numBlocks, hostFunc, blockSize, dynamicSMemSize, flags);
+}
+
+#endif
+
+
+
+/*******************************************************************************
+ * *
+ * *
+ * *
+ *******************************************************************************/
+__host__ cudaError_t CUDARTAPI cudaMemset(void *mem, int c, size_t count)
+{
+ return cudaMemsetInternal(mem, c, count);
+}
+
+//memset operation is done but i think its not async?
+__host__ cudaError_t CUDARTAPI cudaMemsetAsync(void *mem, int c, size_t count, cudaStream_t stream=0)
+{
+ return cudaMemsetAsyncInternal(mem, c, count, stream=0);
+}
+
__host__ cudaError_t CUDARTAPI cudaMemset2D(void *mem, size_t pitch, int c, size_t width, size_t height)
{
if(g_debug_execution >= 3){
@@ -1986,61 +2516,18 @@ __host__ cudaError_t CUDARTAPI cudaBindTexture(size_t *offset,
const struct cudaChannelFormatDesc *desc,
size_t size __dv(UINT_MAX))
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUctx_st *context = GPGPUSim_Context();
- gpgpu_t *gpu = context->get_device()->get_gpgpu();
- printf("GPGPU-Sim PTX: in cudaBindTexture: sizeof(struct textureReference) = %zu\n", sizeof(struct textureReference));
- struct cudaArray *array;
- array = (struct cudaArray*) malloc(sizeof(struct cudaArray));
- array->desc = *desc;
- array->size = size;
- array->width = size;
- array->height = 1;
- array->dimensions = 1;
- array->devPtr = (void*)devPtr;
- array->devPtr32 = (int)(long long)devPtr;
- offset = 0;
- printf("GPGPU-Sim PTX: size = %zu\n", size);
- printf("GPGPU-Sim PTX: texref = %p, array = %p\n", texref, array);
- printf("GPGPU-Sim PTX: devPtr32 = %x\n", array->devPtr32);
- printf("GPGPU-Sim PTX: Name corresponding to textureReference: %s\n", gpu->gpgpu_ptx_sim_findNamefromTexture(texref));
- printf("GPGPU-Sim PTX: ChannelFormatDesc: x=%d, y=%d, z=%d, w=%d\n", desc->x, desc->y, desc->z, desc->w);
- printf("GPGPU-Sim PTX: Texture Normalized? = %d\n", texref->normalized);
- gpu->gpgpu_ptx_sim_bindTextureToArray(texref, array);
- devPtr = (void*)(long long)array->devPtr32;
- printf("GPGPU-Sim PTX: devPtr = %p\n", devPtr);
- return g_last_cudaError = cudaSuccess;
+ return cudaBindTextureInternal(offset, texref, devPtr, desc, size __dv(UINT_MAX));
}
__host__ cudaError_t CUDARTAPI cudaBindTextureToArray(const struct textureReference *texref, const struct cudaArray *array, const struct cudaChannelFormatDesc *desc)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUctx_st *context = GPGPUSim_Context();
- gpgpu_t *gpu = context->get_device()->get_gpgpu();
- printf("GPGPU-Sim PTX: in cudaBindTextureToArray: %p %p\n", texref, array);
- printf("GPGPU-Sim PTX: devPtr32 = %x\n", array->devPtr32);
- printf("GPGPU-Sim PTX: Name corresponding to textureReference: %s\n", gpu->gpgpu_ptx_sim_findNamefromTexture(texref));
- printf("GPGPU-Sim PTX: Texture Normalized? = %d\n", texref->normalized);
- gpu->gpgpu_ptx_sim_bindTextureToArray(texref, array);
- return g_last_cudaError = cudaSuccess;
+ return cudaBindTextureToArrayInternal(texref, array, desc);
}
-__host__ cudaError_t CUDARTAPI cudaUnbindTexture(const struct textureReference *texref){
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUctx_st *context = GPGPUSim_Context();
- gpgpu_t *gpu = context->get_device()->get_gpgpu();
- printf("GPGPU-Sim PTX: in cudaUnbindTexture: sizeof(struct textureReference) = %zu\n", sizeof(struct textureReference));
- printf("GPGPU-Sim PTX: Name corresponding to textureReference: %s\n", gpu->gpgpu_ptx_sim_findNamefromTexture(texref));
-
- gpu->gpgpu_ptx_sim_unbindTexture(texref);
- return g_last_cudaError = cudaSuccess;
+__host__ cudaError_t CUDARTAPI cudaUnbindTexture(const struct textureReference *texref)
+{
+ return cudaUnbindTextureInternal(texref);
}
__host__ cudaError_t CUDARTAPI cudaGetTextureAlignmentOffset(size_t *offset, const struct textureReference *texref)
@@ -2125,24 +2612,9 @@ __host__ cudaError_t CUDARTAPI cudaLaunch( const char *hostFun )
return cudaLaunchInternal( hostFun );
}
-__host__ cudaError_t CUDARTAPI cudaLaunchKernel ( const char* hostFun, dim3 gridDim, dim3 blockDim, const void** args, size_t sharedMem, cudaStream_t stream )
+__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);
-#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;
+ return cudaLaunchKernelInternal(hostFun, gridDim, blockDim, args, sharedMem, stream);
}
@@ -2154,18 +2626,7 @@ __host__ cudaError_t CUDARTAPI cudaLaunchKernel ( const char* hostFun, dim3 grid
__host__ cudaError_t CUDARTAPI cudaStreamCreate(cudaStream_t *stream)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- printf("GPGPU-Sim PTX: cudaStreamCreate\n");
-#if (CUDART_VERSION >= 3000)
- *stream = new struct CUstream_st();
- g_stream_manager()->add_stream(*stream);
-#else
- *stream = 0;
- printf("GPGPU-Sim PTX: WARNING: Asynchronous kernel execution not supported (%s)\n", __my_func__);
-#endif
- return g_last_cudaError = cudaSuccess;
+ return cudaStreamCreateInternal(stream);
}
//TODO: introduce priorities
@@ -2192,32 +2653,12 @@ __host__ __device__ cudaError_t CUDARTAPI cudaStreamCreateWithFlags(cudaStream_t
__host__ cudaError_t CUDARTAPI cudaStreamDestroy(cudaStream_t stream)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
-#if (CUDART_VERSION >= 3000)
- //per-stream synchronization required for application using external libraries without explicit synchronization in the code to
- //avoid the stream_manager from spinning forever to destroy non-empty streams without making any forward progress.
- stream->synchronize();
- g_stream_manager()->destroy_stream(stream);
-#endif
- return g_last_cudaError = cudaSuccess;
+ return cudaStreamDestroyInternal(stream);
}
__host__ cudaError_t CUDARTAPI cudaStreamSynchronize(cudaStream_t stream)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
-#if (CUDART_VERSION >= 3000)
- if( stream == NULL )
- synchronize();
- return g_last_cudaError = cudaSuccess;
- stream->synchronize();
-#else
- printf("GPGPU-Sim PTX: WARNING: Asynchronous kernel execution not supported (%s)\n", __my_func__);
-#endif
- return g_last_cudaError = cudaSuccess;
+ return cudaStreamSynchronizeInternal(stream);
}
__host__ cudaError_t CUDARTAPI cudaStreamQuery(cudaStream_t stream)
@@ -2256,52 +2697,14 @@ __host__ cudaError_t CUDARTAPI cudaEventCreate(cudaEvent_t *event)
return g_last_cudaError = cudaSuccess;
}
-CUevent_st *get_event(cudaEvent_t event)
-{
- unsigned event_uid;
-#if CUDART_VERSION >= 3000
- event_uid = event->get_uid();
-#else
- event_uid = event;
-#endif
- event_tracker_t::iterator e = g_timer_events.find(event_uid);
- if( e == g_timer_events.end() )
- return NULL;
- return e->second;
-}
-
__host__ cudaError_t CUDARTAPI cudaEventRecord(cudaEvent_t event, cudaStream_t stream)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUevent_st *e = get_event(event);
- if( !e ) return g_last_cudaError = cudaErrorUnknown;
- struct CUstream_st *s = (struct CUstream_st *)stream;
- stream_operation op(e,s);
- g_stream_manager()->push(op);
- return g_last_cudaError = cudaSuccess;
+ return cudaEventRecordInternal(event, stream);
}
__host__ cudaError_t CUDARTAPI cudaStreamWaitEvent(cudaStream_t stream, cudaEvent_t event, unsigned int flags)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- //reference: https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/html/group__CUDART__STREAM_gfe68d207dc965685d92d3f03d77b0876.html
- CUevent_st *e = get_event(event);
- if( !e ){
- printf("GPGPU-Sim API: Warning: cudaEventRecord has not been called on event before calling cudaStreamWaitEvent.\nNothing to be done.\n");
- return g_last_cudaError = cudaSuccess;
- }
- if (!stream){
- g_stream_manager()->pushCudaStreamWaitEventToAllStreams(e, flags);
- } else {
- struct CUstream_st *s = (struct CUstream_st *)stream;
- stream_operation op(s,e,flags);
- g_stream_manager()->push(op);
- }
- return g_last_cudaError = cudaSuccess;
+ return cudaStreamWaitEventInternal(stream, event, flags);
}
__host__ cudaError_t CUDARTAPI cudaEventQuery(cudaEvent_t event)
@@ -2374,22 +2777,13 @@ __host__ cudaError_t CUDARTAPI cudaEventElapsedTime(float *ms, cudaEvent_t start
__host__ cudaError_t CUDARTAPI cudaThreadExit(void)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- exit_simulation();
- return g_last_cudaError = cudaSuccess;
+ return cudaThreadExitInternal();
}
__host__ cudaError_t CUDARTAPI cudaThreadSynchronize(void)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- //Called on host side
- synchronize();
- return g_last_cudaError = cudaSuccess;
-};
+ return cudaThreadSynchronizeInternal();
+}
int CUDARTAPI __cudaSynchronizeThreads(void**, void*)
{
@@ -2502,7 +2896,6 @@ void cuda_runtime_api::extract_ptx_files_using_cuobjdump(CUctx_st *context){
while (std::getline(infile, line))
{
//int pos = line.find(std::string(get_app_binary_name(app_binary)));
- const char *ptx_file = line.c_str();
int pos1 = line.find("sm_");
int pos2 = line.find_last_of(".");
if (pos1==std::string::npos&&pos2==std::string::npos){
@@ -2529,12 +2922,11 @@ void cuda_runtime_api::extract_ptx_files_using_cuobjdump(CUctx_st *context){
* enabled
* */
void cuda_runtime_api::extract_code_using_cuobjdump(){
- CUctx_st *context = GPGPUSim_Context();
- unsigned forced_max_capability = context->get_device()->get_gpgpu()->get_config().get_forced_max_capability();
+ CUctx_st *context = GPGPUSim_Context(gpgpu_ctx);
//prevent the dumping by cuobjdump everytime we execute the code!
const char *override_cuobjdump = getenv("CUOBJDUMP_SIM_FILE");
- char command[1000], ptx_file[1000];
+ char command[1000];
std::string app_binary = get_app_binary();
//Running cuobjdump using dynamic link to current process
snprintf(command,1000,"md5sum %s ", app_binary.c_str());
@@ -2888,7 +3280,7 @@ cuobjdumpPTXSection* cuda_runtime_api::findPTXSection(const std::string identifi
//! Extract the code using cuobjdump and remove unnecessary sections
void cuda_runtime_api::cuobjdumpInit(){
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(gpgpu_ctx);
extract_code_using_cuobjdump(); //extract all the output of cuobjdump to _cuobjdump_*.*
const char* pre_load = getenv("CUOBJDUMP_SIM_FILE");
if (pre_load ==NULL || strlen(pre_load)==0){
@@ -2901,7 +3293,7 @@ void cuda_runtime_api::cuobjdumpInit(){
//! Either submit PTX for simulation or convert SASS to PTXPlus and submit it
void gpgpu_context::cuobjdumpParseBinary(unsigned int handle){
- CUctx_st *context = GPGPUSim_Context();
+ CUctx_st *context = GPGPUSim_Context(this);
if(api->fatbin_registered[handle]) return;
api->fatbin_registered[handle] = true;
std::string fname = api->fatbinmap[handle];
@@ -3095,15 +3487,11 @@ cudaError_t cudaDeviceReset ( void ) {
}
return g_last_cudaError = cudaSuccess;
}
-cudaError_t CUDARTAPI cudaDeviceSynchronize(void){
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- //Blocks until the device has completed all preceding requested tasks
- synchronize();
- return g_last_cudaError = cudaSuccess;
-}
+cudaError_t CUDARTAPI cudaDeviceSynchronize(void)
+{
+ return cudaDeviceSynchronizeInternal();
+}
void __cudaRegisterShared(
void **fatCubinHandle,
@@ -3142,22 +3530,7 @@ void __cudaRegisterTexture(
int ext
) //passes in a newly created textureReference
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- std::string devStr (deviceName);
- #if (CUDART_VERSION > 4020)
- if (devStr.size() > 2 && devStr.data()[0] == ':' && devStr.data()[1] == ':')
- devStr = devStr.replace(0, 2, "");
- #endif
- CUctx_st *context = GPGPUSim_Context();
- gpgpu_t *gpu = context->get_device()->get_gpgpu();
- printf("GPGPU-Sim PTX: in __cudaRegisterTexture:\n");
- gpu->gpgpu_ptx_sim_bindNameToTexture(devStr.data(), hostVar, dim, norm, ext);
- printf("GPGPU-Sim PTX: int dim = %d\n", dim);
- printf("GPGPU-Sim PTX: int norm = %d\n", norm);
- printf("GPGPU-Sim PTX: int ext = %d\n", ext);
- printf("GPGPU-Sim PTX: Execution warning: Not finished implementing \"%s\"\n", __my_func__ );
+ __cudaRegisterTextureInternal(fatCubinHandle, hostVar, deviceAddress, deviceName, dim, norm, ext);
}
@@ -3189,30 +3562,7 @@ cudaError_t cudaGLMapBufferObject(void** devPtr, GLuint bufferObj)
cudaError_t cudaGLUnmapBufferObject(GLuint bufferObj)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
-#ifdef OPENGL_SUPPORT
- CUctx_st* ctx = GPGPUSim_Context();
- glbmap_entry_t *p = ctx->api->g_glbmap;
- while ( p && p->m_bufferObj != bufferObj )
- p = p->m_next;
- if ( p == NULL )
- return g_last_cudaError = cudaErrorUnknown;
-
- char *data = (char *) calloc(p->m_size,1);
- memcpy_from_gpu( data,(size_t)p->m_devPtr,p->m_size );
- glBufferSubData(GL_ARRAY_BUFFER,0,p->m_size,data);
- free(data);
-
- return g_last_cudaError = cudaSuccess;
-#else
- fflush(stdout);
- fflush(stderr);
- printf("GPGPU-Sim PTX: support for OpenGL integration disabled -- exiting\n");
- fflush(stdout);
- exit(50);
-#endif
+ return cudaGLUnmapBufferObjectInternal(bufferObj);
}
cudaError_t cudaGLUnregisterBufferObject(GLuint bufferObj)
@@ -3324,12 +3674,7 @@ cudaError_t CUDARTAPI cudaRuntimeGetVersion(int *runtimeVersion)
#if CUDART_VERSION >= 3000
__host__ cudaError_t CUDARTAPI cudaFuncSetCacheConfig(const char *func, enum cudaFuncCache cacheConfig )
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- CUctx_st *context = GPGPUSim_Context();
- context->get_device()->get_gpgpu()->set_cache_config(context->get_kernel(func)->get_name(), (FuncCache)cacheConfig);
- return g_last_cudaError = cudaSuccess;
+ return cudaFuncSetCacheConfigInternal(func, cacheConfig);
}
//Jin: hack for cdp
@@ -5035,23 +5380,7 @@ CUresult CUDAAPI cuLaunchKernel(CUfunction f,
void **kernelParams,
void **extra)
{
- if(g_debug_execution >= 3){
- announce_call(__my_func__);
- }
- if (extra!=NULL){
- printf("GPGPU-Sim CUDA DRIVER API: ERROR: Currently do not support void** extra.\n");
- abort();
- }
- const char *hostFun = (const char*) f;
- CUctx_st *context = GPGPUSim_Context();
- function_info *entry = context->get_kernel(hostFun);
- cudaConfigureCallInternal(dim3(gridDimX, gridDimY, gridDimZ), dim3(blockDimX, blockDimY, blockDimZ), sharedMemBytes, (cudaStream_t) hStream);
- for(unsigned i = 0; i < entry->num_args(); i++){
- std::pair<size_t, unsigned> p = entry->get_param_config(i);
- cudaSetupArgument(kernelParams[i], p.first, p.second);
- }
- cudaLaunchInternal(hostFun);
- return CUDA_SUCCESS;
+ return cuLaunchKernelInternal(f, gridDimX, gridDimY, gridDimZ, blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams, extra);
}
#endif /* CUDART_VERSION >= 4000 */
diff --git a/libcuda/gpgpu_context.h b/libcuda/gpgpu_context.h
index d3c5d74..bbbdc65 100644
--- a/libcuda/gpgpu_context.h
+++ b/libcuda/gpgpu_context.h
@@ -52,6 +52,10 @@ class gpgpu_context {
cuda_device_runtime* device_runtime;
ptx_stats* stats;
// member function list
+ void synchronize();
+ void exit_simulation();
+ void print_simulation_time();
+ int gpgpu_opencl_ptx_sim_main_perf( kernel_info_t *grid );
void cuobjdumpParseBinary(unsigned int handle);
class symbol_table *gpgpu_ptx_sim_load_ptx_from_string( const char *p, unsigned source_num );
class symbol_table *gpgpu_ptx_sim_load_ptx_from_filename( const char *filename );
@@ -60,6 +64,7 @@ class gpgpu_context {
void print_ptx_file( const char *p, unsigned source_num, const char *filename );
class symbol_table* init_parser(const char*);
class gpgpu_sim *gpgpu_ptx_sim_init_perf();
+ void start_sim_thread(int api);
struct _cuda_device_id *GPGPUSim_Init();
void ptx_reg_options(option_parser_t opp);
const ptx_instruction* pc_to_instruction(unsigned pc);