summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcuda/cuda_runtime_api.cc19
-rw-r--r--src/cuda-sim/ptx_loader.cc23
-rw-r--r--src/cuda-sim/ptx_loader.h1
3 files changed, 38 insertions, 5 deletions
diff --git a/libcuda/cuda_runtime_api.cc b/libcuda/cuda_runtime_api.cc
index db4f58e..c87c6c3 100644
--- a/libcuda/cuda_runtime_api.cc
+++ b/libcuda/cuda_runtime_api.cc
@@ -152,7 +152,8 @@ std::map<void *,void **> pinned_memory; //support for pinned memories added
std::map<void *, size_t> pinned_memory_size;
std::map<unsigned long long, size_t> g_mallocPtr_Size;
int no_of_ptx=0;
-std::map<int, std::set<std::string> > version_filename;
+//maps sm version number to set of filenames
+std::map<unsigned, std::set<std::string> > version_filename;
extern void synchronize();
extern void exit_simulation();
@@ -1718,7 +1719,8 @@ char* get_app_binary_name(std::string abs_path){
}
//extracts all ptx files from binary and dumps into prog_name.unique_no.sm_<>.ptx files
-void extract_ptx_files_using_cuobjdump(bool g_cdp_enabled){
+void extract_ptx_files_using_cuobjdump(){
+ extern bool g_cdp_enabled;
char command[1000];
std::string app_binary = get_app_binary();
@@ -1808,7 +1810,8 @@ void extract_code_using_cuobjdump(){
//dump ptx for all individial ptx files into sepearte files which is later used by ptxas.
int result=0;
#if (CUDART_VERSION >= 6000)
- extract_ptx_files_using_cuobjdump(g_cdp_enabled);
+ extract_ptx_files_using_cuobjdump();
+ return;
#endif
//TODO: redundant to dump twice. how can it be prevented?
//dump only for specific arch
@@ -2168,7 +2171,7 @@ void cuobjdumpParseBinary(unsigned int handle){
#if (CUDART_VERSION >= 6000)
//loops through all ptx files from smallest sm version to largest
- std::map<int,std::set<std::string> >::iterator itr_m;
+ std::map<unsigned,std::set<std::string> >::iterator itr_m;
for (itr_m = version_filename.begin(); itr_m!=version_filename.end(); itr_m++){
std::set<std::string>::iterator itr_s;
for (itr_s = itr_m->second.begin(); itr_s!=itr_m->second.end(); itr_s++){
@@ -2181,6 +2184,14 @@ void cuobjdumpParseBinary(unsigned int handle){
context->add_binary(symtab, handle);
load_static_globals(symtab,STATIC_ALLOC_LIMIT,0xFFFFFFFF,context->get_device()->get_gpgpu());
load_constants(symtab,STATIC_ALLOC_LIMIT,context->get_device()->get_gpgpu());
+ for (itr_m = version_filename.begin(); itr_m!=version_filename.end(); itr_m++){
+ std::set<std::string>::iterator itr_s;
+ for (itr_s = itr_m->second.begin(); itr_s!=itr_m->second.end(); itr_s++){
+ std::string ptx_filename = *itr_s;
+ printf("GPGPU-Sim PTX: Loading PTXInfo from %s\n",ptx_filename.c_str());
+ gpgpu_ptx_info_load_from_filename( ptx_filename.c_str(), itr_m->first );
+ }
+ }
return;
#endif
diff --git a/src/cuda-sim/ptx_loader.cc b/src/cuda-sim/ptx_loader.cc
index 2064b13..f5a1c77 100644
--- a/src/cuda-sim/ptx_loader.cc
+++ b/src/cuda-sim/ptx_loader.cc
@@ -320,8 +320,29 @@ char* get_app_binary_name(){
return self_exe_path;
}
-void gpgpu_ptx_info_load_from_filename( const char *filename )
+void gpgpu_ptx_info_load_from_filename( const char *filename, unsigned sm_version)
{
+ std::string ptxas_filename(std::string(filename) + "as");
+ char buff[1024], extra_flags[256];
+ extra_flags[0]=0;
+ extern bool g_cdp_enabled;
+ if(!g_cdp_enabled)
+ snprintf(extra_flags,1024,"--gpu-name=sm_%u",sm_version);
+ else
+ snprintf(extra_flags,1024,"--compile-only --gpu-name=sm_%u",sm_version);
+ snprintf(buff,1024,"$CUDA_INSTALL_PATH/bin/ptxas %s -v %s --output-file /dev/null 2> %s",
+ extra_flags, filename, ptxas_filename.c_str());
+ int result = system(buff);
+ if( result != 0 ) {
+ printf("GPGPU-Sim PTX: ERROR ** while loading PTX (b) %d\n", result);
+ printf(" Ensure ptxas is in your path.\n");
+ exit(1);
+ }
+
+ g_ptxinfo_filename = strdup(ptxas_filename.c_str());
+ ptxinfo_in = fopen(g_ptxinfo_filename,"r");
+ ptxinfo_parse();
+ fclose(ptxinfo_in);
}
void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num, unsigned sm_version )
diff --git a/src/cuda-sim/ptx_loader.h b/src/cuda-sim/ptx_loader.h
index c5c9dd8..e5df6a9 100644
--- a/src/cuda-sim/ptx_loader.h
+++ b/src/cuda-sim/ptx_loader.h
@@ -35,6 +35,7 @@ extern int no_of_ptx; //counter to track number of ptx files to be extracted in
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 );
void gpgpu_ptxinfo_load_from_string( const char *p_for_info, unsigned source_num, unsigned sm_version=20 );
+void gpgpu_ptx_info_load_from_filename( const char *filename, unsigned sm_version );
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();