summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES7
-rw-r--r--Makefile2
-rw-r--r--libcuda/cuda_runtime_api.cc41
-rw-r--r--libcuda/cuobjdump.l66
-rw-r--r--libcuda/cuobjdump.y25
-rw-r--r--libopencl/opencl_runtime_api.cc4
-rw-r--r--setup_environment2
-rw-r--r--src/cuda-sim/ptx_loader.cc5
-rw-r--r--src/cuda-sim/ptx_loader.h2
9 files changed, 114 insertions, 40 deletions
diff --git a/CHANGES b/CHANGES
index 512993b..effc345 100644
--- a/CHANGES
+++ b/CHANGES
@@ -5,10 +5,13 @@ Version 3.2.3+edits (development branch) versus 3.2.3
the two default cache sizes, 16KB/48KB with 32/64 sets.
- Added support for named barriers.
- Added support for bar.arrive and bar.red instructions.
-- Initial support for CUDA 5.0,5.5 and 6.0 to get template running.
+- Initial support for CUDA 5.0,5.5,6.0 and 7.5 to get basic sdk running (e.g., template, vectorAdd, ...). The issues required for CUDA 5.5 support were identified by the loneStarGPU group at The University of Texas at Austin and Texas State University.
- Removed intersim2 svn repository files
- Changed the makefile for cuobjdump_toptxplus,libcuda,intersim2 so that it outputs temporary files into the build directory
-
+- Bug fixes:
+ - Fixed a bug where sm_version was hard coded to sm_20. Now, it extracts the highest sm version that is lower than
+ the forced_max_capability configuration in GPGPUSim.
+
- Bug fixes:
- Fixed bug #81, fix ordering of pushing branch entries to the stack
- Fixed a bug where for each icache miss we also count a hit
diff --git a/Makefile b/Makefile
index 080ca2d..9e2c576 100644
--- a/Makefile
+++ b/Makefile
@@ -155,7 +155,7 @@ $(SIM_LIB_DIR)/libcudart.so: makedirs $(LIBS) cudalib
if [ ! -f $(SIM_LIB_DIR)/libcudart.so.5.0 ]; then ln -s libcudart.so $(SIM_LIB_DIR)/libcudart.so.5.0; fi
if [ ! -f $(SIM_LIB_DIR)/libcudart.so.5.5 ]; then ln -s libcudart.so $(SIM_LIB_DIR)/libcudart.so.5.5; fi
if [ ! -f $(SIM_LIB_DIR)/libcudart.so.6.0 ]; then ln -s libcudart.so $(SIM_LIB_DIR)/libcudart.so.6.0; fi
-
+ if [ ! -f $(SIM_LIB_DIR)/libcudart.so.7.5 ]; then ln -s libcudart.so $(SIM_LIB_DIR)/libcudart.so.7.5; fi
$(SIM_LIB_DIR)/libcudart.dylib: makedirs $(LIBS) cudalib
g++ -dynamiclib -Wl,-headerpad_max_install_names,-undefined,dynamic_lookup,-compatibility_version,1.1,-current_version,1.1\
$(SIM_OBJ_FILES_DIR)/libcuda/*.o \
diff --git a/libcuda/cuda_runtime_api.cc b/libcuda/cuda_runtime_api.cc
index eed4017..910bebd 100644
--- a/libcuda/cuda_runtime_api.cc
+++ b/libcuda/cuda_runtime_api.cc
@@ -1457,18 +1457,22 @@ std::list<cuobjdumpSection*> pruneSectionList(std::list<cuobjdumpSection*> cuobj
std::list<cuobjdumpSection*> prunedList;
- //Find the highest capability (that is lower than the forces maximum) for each cubin file
+ //Find the highest capability (that is lower than the forced maximum) for each cubin file
//and set it in cuobjdumpSectionMap. Do this only for ptx sections
std::map<std::string, unsigned> cuobjdumpSectionMap;
+ int min_ptx_capability_found=0;
for ( std::list<cuobjdumpSection*>::iterator iter = cuobjdumpSectionList.begin();
iter != cuobjdumpSectionList.end();
iter++){
unsigned capability = (*iter)->getArch();
- if(dynamic_cast<cuobjdumpPTXSection*>(*iter) != NULL &&
- (capability <= forced_max_capability ||
- forced_max_capability==0)) {
- if(cuobjdumpSectionMap[(*iter)->getIdentifier()] < capability)
- cuobjdumpSectionMap[(*iter)->getIdentifier()] = capability;
+ if(dynamic_cast<cuobjdumpPTXSection*>(*iter) != NULL){
+ if(capability<min_ptx_capability_found || min_ptx_capability_found==0)
+ min_ptx_capability_found=capability;
+ if (capability <= forced_max_capability || forced_max_capability==0) {
+ if((cuobjdumpSectionMap.find((*iter)->getIdentifier())==cuobjdumpSectionMap.end())
+ || (cuobjdumpSectionMap[(*iter)->getIdentifier()] < capability))
+ cuobjdumpSectionMap[(*iter)->getIdentifier()] = capability;
+ }
}
}
@@ -1484,6 +1488,10 @@ std::list<cuobjdumpSection*> pruneSectionList(std::list<cuobjdumpSection*> cuobj
delete *iter;
}
}
+ if(prunedList.empty()){
+ printf("Error: No PTX sections found with sm capability that is lower than current forced maximum capability \n minimum ptx capability found = %u, maximum forced ptx capability = %u \n User might want to change either the forced maximum capability from gpgpusim configuration or update the compilation to generate the required PTX version\n",min_ptx_capability_found,forced_max_capability);
+ abort();
+ }
return prunedList;
}
@@ -1567,6 +1575,16 @@ void cuobjdumpParseBinary(unsigned int handle){
fatbin_registered[handle] = true;
CUctx_st *context = GPGPUSim_Context();
+ unsigned max_capability = 0;
+ for ( std::list<cuobjdumpSection*>::iterator iter = cuobjdumpSectionList.begin();
+ iter != cuobjdumpSectionList.end();
+ iter++){
+ unsigned capability = (*iter)->getArch();
+ if (capability > max_capability) max_capability = capability;
+ }
+
+ if (max_capability > 20) printf("WARNING: No guarantee that PTX will be parsed for SM version %u\n", max_capability);
+
std::string fname = fatbinmap[handle];
cuobjdumpPTXSection* ptx = findPTXSection(fname);
@@ -1589,13 +1607,13 @@ void cuobjdumpParseBinary(unsigned int handle){
symtab=gpgpu_ptx_sim_load_ptx_from_string(ptxplus_str, handle);
printf("Adding %s with cubin handle %u\n", ptx->getPTXfilename().c_str(), handle);
context->add_binary(symtab, handle);
- gpgpu_ptxinfo_load_from_string( ptxcode, handle);
+ gpgpu_ptxinfo_load_from_string( ptxcode, handle, max_capability );
delete[] ptxplus_str;
} else {
symtab=gpgpu_ptx_sim_load_ptx_from_string(ptxcode, handle);
printf("Adding %s with cubin handle %u\n", ptx->getPTXfilename().c_str(), handle);
context->add_binary(symtab, handle);
- gpgpu_ptxinfo_load_from_string( ptxcode, handle);
+ gpgpu_ptxinfo_load_from_string( ptxcode, handle, max_capability );
}
load_static_globals(symtab,STATIC_ALLOC_LIMIT,0xFFFFFFFF,context->get_device()->get_gpgpu());
load_constants(symtab,STATIC_ALLOC_LIMIT,context->get_device()->get_gpgpu());
@@ -1624,10 +1642,13 @@ void** CUDARTAPI __cudaRegisterFatBinary( void *fatCubin )
// - Obtains the pointer to the actual fatbin structure from the FatBin handle (fatCubin).
// - An integer inside the fatbin structure contains the relative offset to the source code file name.
// - This offset differs among different CUDA and GCC versions.
+ #if (CUDART_VERSION <= 6000)
char * pfatbin = (char*) fatDeviceText->d;
int offset = *((int*)(pfatbin+48));
char * filename = (pfatbin+16+offset);
-
+ #else
+ char * filename = "default";
+ #endif
// The extracted file name is associated with a fat_cubin_handle passed
// into cudaLaunch(). Inside cudaLaunch(), the associated file name is
// used to find the PTX/SASS section from cuobjdump, which contains the
@@ -1693,7 +1714,7 @@ void** CUDARTAPI __cudaRegisterFatBinary( void *fatCubin )
} else {
symtab=gpgpu_ptx_sim_load_ptx_from_string(ptx,source_num);
context->add_binary(symtab,fat_cubin_handle);
- gpgpu_ptxinfo_load_from_string( ptx, source_num );
+ gpgpu_ptxinfo_load_from_string( ptx, source_num, max_capability );
}
source_num++;
load_static_globals(symtab,STATIC_ALLOC_LIMIT,0xFFFFFFFF,context->get_device()->get_gpgpu());
diff --git a/libcuda/cuobjdump.l b/libcuda/cuobjdump.l
index d7086ad..f63ee73 100644
--- a/libcuda/cuobjdump.l
+++ b/libcuda/cuobjdump.l
@@ -52,8 +52,12 @@ void cuobjdump_error(const char*);
%s ptxcode
%s sasscode
%s elfcode
-%s header
+%s elfheader
+%s ptxheader
%s endheader
+%x identifier
+%x conidentifier
+%s endidentifier
alpha [a-zA-Z]
numeric [0-9]
@@ -67,16 +71,20 @@ newlines {newline}+
"ptxasOptions"{notnewline}*{newline}
[1-9]{numeric}* yylval.string_value = strdup(yytext); return DECIMAL;
+"has debug info"{newline}
+
"Fatbin ptx code:"{newline} {
yy_push_state(ptxcode);
- yy_push_state(header);
+ yy_push_state(identifier);
+ yy_push_state(ptxheader);
yylval.string_value = strdup(yytext);
return PTXHEADER;
}
"Fatbin elf code:"{newline} {
yy_push_state(elfcode);
- yy_push_state(header);
+ yy_push_state(identifier);
+ yy_push_state(elfheader);
yylval.string_value = strdup(yytext);
return ELFHEADER;
}
@@ -94,22 +102,50 @@ newlines {newline}+
/*SASS code tokens*/
<sasscode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return SASSLINE;
+<identifier>{newline}"compressed"{newline} BEGIN(conidentifier); return H_COMPRESSED;
+<identifier>{newline}"identifier = " BEGIN(endidentifier); return H_IDENTIFIER;
+<identifier>{newline}{newline} yy_pop_state();
+
+
+<conidentifier>"identifier = " BEGIN(endidentifier); return H_IDENTIFIER;
+<conidentifier>{newline} yy_pop_state();
+
+
+<endidentifier>{notnewline}+ yylval.string_value = strdup(yytext); yy_pop_state(); return FILENAME;
+
+
+
/*Header tokens*/
-<header>[[:alnum:]_]+ yylval.string_value = strdup(yytext); return IDENTIFIER;
-<header>"================" return H_SEPARATOR;
-<header>"arch = " return H_ARCH;
-<header>"code version = " return H_CODEVERSION;
-<header>\[{numeric},{numeric}\] return CODEVERSION;
-<header>"producer = " return H_PRODUCER;
-<header>"host = " return H_HOST;
-<header>"compile_size = " return H_COMPILESIZE;
-<header>"compressed"{newline}
-<header>"identifier = " BEGIN(endheader); return H_IDENTIFIER;
-<header>"has debug info"{newline}
+<elfheader>[[:alnum:]_]+ yylval.string_value = strdup(yytext); return IDENTIFIER;
+<elfheader>"================" return H_SEPARATOR;
+<elfheader>"arch = " return H_ARCH;
+<elfheader>"code version = " return H_CODEVERSION;
+<elfheader>\[{numeric},{numeric}\] return CODEVERSION;
+<elfheader>"producer = " return H_PRODUCER;
+<elfheader>"<unknown>" return H_UNKNOWN;
+<elfheader>"host = " return H_HOST;
+<elfheader>"compile_size = " BEGIN(endheader); return H_COMPILESIZE;
+
+
+ /*Header tokens*/
+<ptxheader>[[:alnum:]_]+ yylval.string_value = strdup(yytext); return IDENTIFIER;
+<ptxheader>"================" return H_SEPARATOR;
+<ptxheader>"arch = " return H_ARCH;
+<ptxheader>"code version = " return H_CODEVERSION;
+<ptxheader>\[{numeric},{numeric}\] return CODEVERSION;
+<ptxheader>"producer = " return H_PRODUCER;
+<ptxheader>"host = " return H_HOST;
+<ptxheader>"compile_size = " BEGIN(endheader); return H_COMPILESIZE;
+
+
+
+
+
/* Looking for the identifier (filename) then the header is done */
/* <endheader>[[:alnum:]_\./]+ yylval.string_value = strdup(yytext); yy_pop_state(); return FILENAME; */
-<endheader>{notnewline}+ yylval.string_value = strdup(yytext); yy_pop_state(); return FILENAME;
+<endheader>{notnewline}+ yylval.string_value = strdup(yytext); yy_pop_state(); return IDENTIFIER;
+
{newline} return NEWLINE;
diff --git a/libcuda/cuobjdump.y b/libcuda/cuobjdump.y
index ec97283..dce7e3d 100644
--- a/libcuda/cuobjdump.y
+++ b/libcuda/cuobjdump.y
@@ -47,7 +47,7 @@ char filename [1024];
%union {
char* string_value;
}
-%token <string_value> H_SEPARATOR H_ARCH H_CODEVERSION H_PRODUCER H_HOST H_COMPILESIZE H_IDENTIFIER
+%token <string_value> H_SEPARATOR H_ARCH H_CODEVERSION H_PRODUCER H_HOST H_COMPILESIZE H_IDENTIFIER H_UNKNOWN H_COMPRESSED
%token <string_value> CODEVERSION
%token <string_value> STRING
%token <string_value> FILENAME
@@ -61,6 +61,7 @@ char filename [1024];
%%
+
program : {printf("######### cuobjdump parser ########\n");}
emptylines section
| program section;
@@ -73,7 +74,7 @@ section : PTXHEADER {
snprintf(filename, 1024, "_cuobjdump_%d.ptx", ptxserial++);
ptxfile = fopen(filename, "w");
setCuobjdumpptxfilename(filename);
- } headerinfo ptxcode {
+ } headerinfo compressedkeyword identifier ptxcode {
fclose(ptxfile);
}
| ELFHEADER {
@@ -81,7 +82,8 @@ section : PTXHEADER {
snprintf(filename, 1024, "_cuobjdump_%d.elf", elfserial);
elffile = fopen(filename, "w");
setCuobjdumpelffilename(filename);
- } headerinfo elfcode {
+ } headerinfo identifier{
+ } elfcode {
fclose(elffile);
snprintf(filename, 1024, "_cuobjdump_%d.sass", elfserial++);
sassfile = fopen(filename, "w");
@@ -93,15 +95,26 @@ section : PTXHEADER {
headerinfo : H_SEPARATOR NEWLINE
H_ARCH IDENTIFIER NEWLINE
H_CODEVERSION CODEVERSION NEWLINE
+ H_PRODUCER H_UNKNOWN NEWLINE
+ H_HOST IDENTIFIER NEWLINE
+ H_COMPILESIZE IDENTIFIER {setCuobjdumparch($4);};
+ | H_SEPARATOR NEWLINE
+ H_ARCH IDENTIFIER NEWLINE
+ H_CODEVERSION CODEVERSION NEWLINE
H_PRODUCER IDENTIFIER NEWLINE
H_HOST IDENTIFIER NEWLINE
- H_COMPILESIZE IDENTIFIER NEWLINE
- H_IDENTIFIER FILENAME emptylines {setCuobjdumparch($4); setCuobjdumpidentifier($19);};
+ H_COMPILESIZE IDENTIFIER {setCuobjdumparch($4);};
+
+identifier : H_IDENTIFIER FILENAME emptylines {setCuobjdumpidentifier($2);}
+ | {setCuobjdumpidentifier("default");};
+
+compressedkeyword : H_COMPRESSED emptylines
+ | ;
ptxcode : ptxcode PTXLINE {fprintf(ptxfile, "%s", $2);}
| ;
-elfcode : elfcode ELFLINE {fprintf(elffile, "%s", $2);}
+elfcode : elfcode ELFLINE {printf(elffile, "%s", $2);}
| ;
sasscode : sasscode SASSLINE {fprintf(sassfile, "%s", $2);}
diff --git a/libopencl/opencl_runtime_api.cc b/libopencl/opencl_runtime_api.cc
index 9da895d..020384f 100644
--- a/libopencl/opencl_runtime_api.cc
+++ b/libopencl/opencl_runtime_api.cc
@@ -268,7 +268,7 @@ cl_int _cl_kernel::bind_args( gpgpu_ptx_sim_arg_list_t &arg_list )
if( i->first != k )
return CL_INVALID_KERNEL_ARGS;
arg_info arg = i->second;
- gpgpu_ptx_sim_arg param( arg.m_arg_value, arg.m_arg_size, 0 );
+ gpgpu_ptx_sim_arg param( arg.m_arg_value, arg.m_arg_size, 0);
arg_list.push_front( param );
k++;
}
@@ -575,7 +575,7 @@ void _cl_program::Build(const char *options)
}
info.m_asm = tmp;
info.m_symtab = gpgpu_ptx_sim_load_ptx_from_string( tmp, source_num );
- gpgpu_ptxinfo_load_from_string( tmp, source_num );
+ gpgpu_ptxinfo_load_from_string( tmp, source_num);
free(tmp);
}
printf("GPGPU-Sim OpenCL API: finished compiling OpenCL kernels.\n");
diff --git a/setup_environment b/setup_environment
index c55d71f..2684514 100644
--- a/setup_environment
+++ b/setup_environment
@@ -43,7 +43,7 @@ CC_VERSION=`gcc --version | head -1 | awk '{for(i=1;i<=NF;i++){ if(match($i,/^[0
CUDA_VERSION_STRING=`$CUDA_INSTALL_PATH/bin/nvcc --version | awk '/release/ {print $5;}' | sed 's/,//'`;
CUDA_VERSION_NUMBER=`echo $CUDA_VERSION_STRING | sed 's/\./ /' | awk '{printf("%02u%02u", 10*int($1), 10*$2);}'`
-if [ $CUDA_VERSION_NUMBER -gt 6000 -o $CUDA_VERSION_NUMBER -lt 2030 ]; then
+if [ $CUDA_VERSION_NUMBER -gt 7500 -o $CUDA_VERSION_NUMBER -lt 2030 ]; then
echo "ERROR ** GPGPU-Sim version $GPGPUSIM_VERSION_STRING not tested with CUDA version $CUDA_VERSION_STRING (please see README)";
return
elif [ $CUDA_VERSION_NUMBER -gt 4020 ]; then
diff --git a/src/cuda-sim/ptx_loader.cc b/src/cuda-sim/ptx_loader.cc
index e293065..f7bf70e 100644
--- a/src/cuda-sim/ptx_loader.cc
+++ b/src/cuda-sim/ptx_loader.cc
@@ -182,7 +182,7 @@ symbol_table *gpgpu_ptx_sim_load_ptx_from_string( const char *p, unsigned source
return symtab;
}
-void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num )
+void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num, unsigned sm_version )
{
char fname[1024];
snprintf(fname,1024,"_ptx_XXXXXX");
@@ -216,7 +216,8 @@ void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num
extra_flags[0]=0;
#if CUDART_VERSION >= 3000
- snprintf(extra_flags,1024,"--gpu-name=sm_20");
+ if (sm_version == 0) sm_version = 20;
+ snprintf(extra_flags,1024,"--gpu-name=sm_%u",sm_version);
#endif
snprintf(commandline,1024,"$CUDA_INSTALL_PATH/bin/ptxas %s -v %s --output-file /dev/null 2> %s",
diff --git a/src/cuda-sim/ptx_loader.h b/src/cuda-sim/ptx_loader.h
index cb02eda..d3d0c92 100644
--- a/src/cuda-sim/ptx_loader.h
+++ b/src/cuda-sim/ptx_loader.h
@@ -32,7 +32,7 @@
extern bool g_override_embedded_ptx;
class symbol_table *gpgpu_ptx_sim_load_ptx_from_string( const char *p, unsigned source_num );
-void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num );
+void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num, unsigned sm_version=20 );
char* gpgpu_ptx_sim_convert_ptx_and_sass_to_ptxplus(const std::string ptx_str, const std::string sass_str, const std::string elf_str);
bool keep_intermediate_files();