summaryrefslogtreecommitdiff
path: root/src/cuda-sim
diff options
context:
space:
mode:
authorJonathan <[email protected]>2018-06-21 17:35:07 -0700
committerJonathan <[email protected]>2018-06-21 17:35:07 -0700
commit76a124e9186b9574858238d423b9c5ce715f2c32 (patch)
tree0e1c3a82661f06baafbf9505b216ef94ab3cbc91 /src/cuda-sim
parent37dc5311a75548b848a33a3b7369ce4bee64b444 (diff)
WIP adding support for PTX JIT and dumping params to cudaLaunches
Diffstat (limited to 'src/cuda-sim')
-rw-r--r--src/cuda-sim/cuda-sim.cc81
-rw-r--r--src/cuda-sim/cuda-sim.h1
-rw-r--r--src/cuda-sim/instructions.cc1
-rw-r--r--src/cuda-sim/ptx_ir.cc8
-rw-r--r--src/cuda-sim/ptx_ir.h2
5 files changed, 93 insertions, 0 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc
index 34368ce..6875edd 100644
--- a/src/cuda-sim/cuda-sim.cc
+++ b/src/cuda-sim/cuda-sim.cc
@@ -1226,6 +1226,87 @@ void function_info::list_param( FILE *fout ) const
fflush(fout);
}
+void function_info::debug_param( ) const
+{
+ char filename[] = "params.txt";
+ char buff[1024];
+ snprintf(buff,1024,"c++filt %s > %s", get_name().c_str(), filename);
+ system(buff);
+ FILE *fp = fopen(filename, "r");
+ fgets(buff, 1024, fp);
+ fclose(fp);
+
+ std::string fn(buff);
+ size_t pos1, pos2;
+ pos1 = fn.find("(");
+ pos2 = fn.find(")");
+ assert(pos2>pos1&&pos1>0);
+ strcpy(buff, fn.substr(pos1 + 1, pos2 - pos1 - 1).c_str());
+ printf("params: %s\n", buff);
+ char *tok;
+ std::vector<std::string> params;
+ tok = strtok(buff, ",");
+ while(tok!=NULL){
+ std::string param(tok);
+ param.erase(0, param.find_first_not_of(" "));
+ param.erase(param.find_last_not_of(" ")+1);
+ params.push_back(param);
+ tok = strtok(NULL, ",");
+ }
+ for (auto const& it : params){
+ std::cout<<it<<std::endl;
+ }
+
+ FILE *fout = fopen (filename, "w");
+ fprintf(fout, "Name of function:%s\n", fn.c_str());
+
+ for( std::map<unsigned,param_info>::const_iterator i=m_ptx_kernel_param_info.begin(); i!=m_ptx_kernel_param_info.end(); i++ ) {
+ const param_info &p = i->second;
+ std::string name = p.get_name();
+ param_t param_value = p.get_value();
+ if(params[i->first].find("const")!=std::string::npos){
+ fprintf(fout, "Input: ");
+ } else {
+ fprintf(fout, "Input/output: ");
+ }
+
+ symbol *param = m_symtab->lookup(name.c_str());
+ addr_t param_addr = param->get_address();
+ fprintf(fout, "%s: %#08x, ", name.c_str(), param_addr);
+
+ if(params[i->first].find("int")!=std::string::npos){
+ size_t len = param_value.size/sizeof(int);
+ int val[len];
+ memcpy((void*) val, param_value.pdata+param_value.offset, param_value.size);
+ fprintf(fout, "val (int) = ");
+ for (unsigned i = 0; i<len; i++){
+ fprintf(fout, "%d ", val[i]);
+ }
+ fprintf(fout, "\n");
+ } else if(params[i->first].find("float")!=std::string::npos){
+ size_t len = param_value.size/sizeof(float);
+ float val[len];
+ memcpy((void*) val, param_value.pdata+param_value.offset, param_value.size);
+ fprintf(fout, "val (float) = ");
+ for (unsigned i = 0; i<len; i++){
+ fprintf(fout, "%f ", val[i]);
+ }
+ fprintf(fout, "\n");
+ }else{
+ size_t len = param_value.size/sizeof(char);
+ char val[len];
+ memcpy((void*) val, param_value.pdata+param_value.offset, param_value.size);
+ fprintf(fout, "val (char) = ");
+ for (unsigned i = 0; i<len; i++){
+ fprintf(fout, "%c ", val[i]);
+ }
+ fprintf(fout, "\n");
+ }
+ }
+ fflush(fout);
+ fclose(fout);
+}
+
template<int activate_level>
bool ptx_debug_exec_dump_cond(int thd_uid, addr_t pc)
{
diff --git a/src/cuda-sim/cuda-sim.h b/src/cuda-sim/cuda-sim.h
index 958daba..9049a84 100644
--- a/src/cuda-sim/cuda-sim.h
+++ b/src/cuda-sim/cuda-sim.h
@@ -32,6 +32,7 @@
#include"../gpgpu-sim/shader.h"
#include <stdlib.h>
#include <map>
+#include <vector>
#include <string>
#include"ptx_sim.h"
diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc
index c77e4da..034a7b9 100644
--- a/src/cuda-sim/instructions.cc
+++ b/src/cuda-sim/instructions.cc
@@ -2753,6 +2753,7 @@ void mov_impl( const ptx_instruction *pI, ptx_thread_info *thread )
const operand_info &dst = pI->dst();
const operand_info &src1 = pI->src1();
unsigned i_type = pI->get_type();
+ assert( src1.is_param_local() == 0 );
if( (src1.is_vector() || dst.is_vector()) && (i_type != BB64_TYPE) && (i_type != BB128_TYPE) && (i_type != FF64_TYPE) ) {
// pack or unpack operation
diff --git a/src/cuda-sim/ptx_ir.cc b/src/cuda-sim/ptx_ir.cc
index 016c600..482b9e0 100644
--- a/src/cuda-sim/ptx_ir.cc
+++ b/src/cuda-sim/ptx_ir.cc
@@ -257,6 +257,14 @@ bool symbol_table::add_function_decl( const char *name, int entry_point, functio
return prior_decl;
}
+function_info *symbol_table::lookup_function( std::string name )
+{
+ std::string key = std::string(name);
+ std::map<std::string,function_info*>::iterator it = m_function_info_lookup.find(key);
+ assert ( it != m_function_info_lookup.end() );
+ return it->second;
+}
+
type_info *symbol_table::add_type( memory_space_t space_spec, int scalar_type_spec, int vector_spec, int alignment_spec, int extern_spec )
{
if( space_spec == param_space_unclassified )
diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h
index 5b68fcf..341f9b7 100644
--- a/src/cuda-sim/ptx_ir.h
+++ b/src/cuda-sim/ptx_ir.h
@@ -313,6 +313,7 @@ public:
symbol *add_variable( const char *identifier, const type_info *type, unsigned size, const char *filename, unsigned line );
void add_function( function_info *func, const char *filename, unsigned linenumber );
bool add_function_decl( const char *name, int entry_point, function_info **func_info, symbol_table **symbol_table );
+ function_info *lookup_function(std::string name);
type_info *add_type( memory_space_t space_spec, int scalar_type_spec, int vector_spec, int alignment_spec, int extern_spec );
type_info *add_type( function_info *func );
type_info *get_array_type( type_info *base_type, unsigned array_dim );
@@ -1256,6 +1257,7 @@ public:
void finalize( memory_space *param_mem );
void param_to_shared( memory_space *shared_mem, symbol_table *symtab );
void list_param( FILE *fout ) const;
+ void debug_param() const;
const struct gpgpu_ptx_sim_info* get_kernel_info () const
{