summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJin Wang <[email protected]>2014-10-19 01:02:20 -0400
committerJin Wang <[email protected]>2016-07-05 09:05:36 -0400
commitd31c2da2b34d3d7a63d9980335c85d5e1a19ad02 (patch)
treea25de8790fed56309849355bfb3618641f323325 /src
parent582106ec595bb7745db092f2f4aa2b0fb9521b16 (diff)
BUG: parameter alignment
Diffstat (limited to 'src')
-rw-r--r--src/cuda-sim/cuda-sim.cc26
-rw-r--r--src/cuda-sim/cuda_device_runtime.cc1
2 files changed, 21 insertions, 6 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc
index 482e3f6..4281913 100644
--- a/src/cuda-sim/cuda-sim.cc
+++ b/src/cuda-sim/cuda-sim.cc
@@ -1066,12 +1066,24 @@ void function_info::add_param_data( unsigned argn, struct gpgpu_ptx_sim_arg *arg
}
unsigned function_info::get_args_aligned_size() {
- unsigned int align_size = 4; // a word
+
+ unsigned param_address = 0;
unsigned int total_size = 0;
- for(unsigned int i = 0; i < num_args(); i++) {
- total_size += ((m_args[i]->get_size_in_bytes() + align_size - 1) / align_size) * align_size;
+ for( std::map<unsigned,param_info>::iterator i=m_ptx_kernel_param_info.begin(); i!=m_ptx_kernel_param_info.end(); i++ ) {
+ param_info &p = i->second;
+ std::string name = p.get_name();
+ symbol *param = m_symtab->lookup(name.c_str());
+
+ size_t arg_size = p.get_size(); // size of param in bytes
+ total_size = (total_size + arg_size - 1) / arg_size * arg_size; //aligned
+ p.add_offset(total_size);
+ param_address += total_size;
+ param->set_address(param_address);
+ total_size += arg_size;
}
- return total_size;
+
+ return (total_size + 3) / 4; //final size aligned to word
+
}
@@ -1097,13 +1109,17 @@ void function_info::finalize( memory_space *param_mem )
size = (size<(p.get_size()/8))?size:(p.get_size()/8);
}
// copy the parameter over word-by-word so that parameter that crosses a memory page can be copied over
+ //Jin: copy parameter using aligned rules
const size_t word_size = 4;
+ param_address = (param_address + size - 1) / size * size; //aligned with size
for (size_t idx = 0; idx < size; idx += word_size) {
const char *pdata = reinterpret_cast<const char*>(param_value.pdata) + idx; // cast to char * for ptr arithmetic
param_mem->write(param_address + idx, word_size, pdata,NULL,NULL);
}
+ unsigned offset = p.get_offset();
+ assert(offset == param_address);
param->set_address(param_address);
- param_address += size;
+ param_address += size;
}
}
diff --git a/src/cuda-sim/cuda_device_runtime.cc b/src/cuda-sim/cuda_device_runtime.cc
index 4d8d1e1..148471b 100644
--- a/src/cuda-sim/cuda_device_runtime.cc
+++ b/src/cuda-sim/cuda_device_runtime.cc
@@ -142,7 +142,6 @@ void gpgpusim_cuda_launchDeviceV2(const ptx_instruction * pI, ptx_thread_info *
for(unsigned n = 0; n < child_kernel_arg_size; n++) {
unsigned char one_byte;
thread->get_gpu()->get_global_memory()->read((size_t)parameter_buffer + n, 1, &one_byte);
- std::cout << "one byte " << std::hex << one_byte << "\n";
child_kernel_param_mem->write(param_start_address + n, 1, &one_byte, NULL, NULL);
}
}