summaryrefslogtreecommitdiff
path: root/src/cuda-sim/cuda_device_printf.cc
diff options
context:
space:
mode:
authorMahmoud <[email protected]>2019-09-16 10:47:08 -0400
committerMahmoud <[email protected]>2019-09-16 10:47:08 -0400
commit0785ce7c9471bf1a0c70500eb60cb293fb5aa2fa (patch)
tree15dcaeaf1b1e0e9e3c04af74e72545854793d244 /src/cuda-sim/cuda_device_printf.cc
parent688044e9f7a9aef0a63a9610b496baafd886c556 (diff)
parentdba877b45fe11187d56904bbd169f4e0a5ad0586 (diff)
Merge branch 'dev' of https://github.com/purdue-aalp/gpgpu-sim_distribution into dev-private
Diffstat (limited to 'src/cuda-sim/cuda_device_printf.cc')
-rw-r--r--src/cuda-sim/cuda_device_printf.cc192
1 files changed, 98 insertions, 94 deletions
diff --git a/src/cuda-sim/cuda_device_printf.cc b/src/cuda-sim/cuda_device_printf.cc
index 9ac0727..1da6b85 100644
--- a/src/cuda-sim/cuda_device_printf.cc
+++ b/src/cuda-sim/cuda_device_printf.cc
@@ -7,108 +7,112 @@
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice, this
-// list of conditions and the following disclaimer in the documentation and/or
-// other materials provided with the distribution.
-// Neither the name of The University of British Columbia nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
+// Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution. Neither the name of
+// The University of British Columbia nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
#include "cuda_device_printf.h"
#include "ptx_ir.h"
-void decode_space( memory_space_t &space, ptx_thread_info *thread, const operand_info &op, memory_space *&mem, addr_t &addr);
+void decode_space(memory_space_t &space, ptx_thread_info *thread,
+ const operand_info &op, memory_space *&mem, addr_t &addr);
-void my_cuda_printf(const char *fmtstr,const char *arg_list)
-{
- FILE *fp = stdout;
- unsigned i=0,j=0;
- unsigned arg_offset=0;
- char buf[64];
- bool in_fmt=false;
- while( fmtstr[i] ) {
- char c = fmtstr[i++];
- if( !in_fmt ) {
- if( c != '%' ) {
- fprintf(fp,"%c",c);
- } else {
- in_fmt=true;
- buf[0] = c;
- j=1;
- }
+void my_cuda_printf(const char *fmtstr, const char *arg_list) {
+ FILE *fp = stdout;
+ unsigned i = 0, j = 0;
+ unsigned arg_offset = 0;
+ char buf[64];
+ bool in_fmt = false;
+ while (fmtstr[i]) {
+ char c = fmtstr[i++];
+ if (!in_fmt) {
+ if (c != '%') {
+ fprintf(fp, "%c", c);
} else {
- if(!( c == 'u' || c == 'f' || c == 'd' )) {
- printf("GPGPU-Sim PTX: ERROR ** printf parsing support is limited to %%u, %%f, %%d at present");
- abort();
- }
- buf[j] = c;
- buf[j+1] = 0;
- void* ptr = (void*)&arg_list[arg_offset];
- //unsigned long long value = ((unsigned long long*)arg_list)[arg_offset];
- if( c == 'u' || c == 'd' ) {
- fprintf(fp,buf,*((unsigned long long*)ptr));
- } else if( c == 'f' ) {
- double tmp = *((double*)ptr);
- fprintf(fp,buf,tmp);
- }
- arg_offset++;
- in_fmt=false;
+ in_fmt = true;
+ buf[0] = c;
+ j = 1;
}
- }
+ } else {
+ if (!(c == 'u' || c == 'f' || c == 'd')) {
+ printf(
+ "GPGPU-Sim PTX: ERROR ** printf parsing support is limited to %%u, "
+ "%%f, %%d at present");
+ abort();
+ }
+ buf[j] = c;
+ buf[j + 1] = 0;
+ void *ptr = (void *)&arg_list[arg_offset];
+ // unsigned long long value = ((unsigned long long*)arg_list)[arg_offset];
+ if (c == 'u' || c == 'd') {
+ fprintf(fp, buf, *((unsigned long long *)ptr));
+ } else if (c == 'f') {
+ double tmp = *((double *)ptr);
+ fprintf(fp, buf, tmp);
+ }
+ arg_offset++;
+ in_fmt = false;
+ }
+ }
}
-void gpgpusim_cuda_vprintf(const ptx_instruction * pI, ptx_thread_info * thread, const function_info * target_func )
-{
- char *fmtstr = NULL;
- char *arg_list = NULL;
- unsigned n_return = target_func->has_return();
- unsigned n_args = target_func->num_args();
- assert( n_args == 2 );
- for( unsigned arg=0; arg < n_args; arg ++ ) {
- const operand_info &actual_param_op = pI->operand_lookup(n_return+1+arg);
- const symbol *formal_param = target_func->get_arg(arg);
- unsigned size=formal_param->get_size_in_bytes();
- assert( formal_param->is_param_local() );
- assert( actual_param_op.is_param_local() );
- addr_t from_addr = actual_param_op.get_symbol()->get_address();
- unsigned long long buffer[1024];
- assert(size<1024*sizeof(unsigned long long));
- thread->m_local_mem->read(from_addr,size,buffer);
- addr_t addr = (addr_t)buffer[0]; // should be pointer to generic memory location
- memory_space *mem=NULL;
- memory_space_t space = generic_space;
- decode_space(space,thread,actual_param_op,mem,addr); // figure out which space
- if( arg == 0 ) {
- unsigned len = 0;
- char b = 0;
- do { // figure out length
- mem->read(addr+len,1,&b);
- len++;
- } while(b);
- fmtstr = (char*)malloc(len+64);
- for( int i=0; i < len; i++ )
- mem->read(addr+i,1,fmtstr+i);
- //mem->read(addr,len,fmtstr);
- } else {
- unsigned len = thread->get_finfo()->local_mem_framesize();
- arg_list = (char*)malloc(len+64);
- for( int i=0; i < len; i++ )
- mem->read(addr+i,1,arg_list+i);
- //mem->read(addr,len,arg_list);
- }
- }
- my_cuda_printf(fmtstr,arg_list);
- free(fmtstr);
- free(arg_list);
+void gpgpusim_cuda_vprintf(const ptx_instruction *pI, ptx_thread_info *thread,
+ const function_info *target_func) {
+ char *fmtstr = NULL;
+ char *arg_list = NULL;
+ unsigned n_return = target_func->has_return();
+ unsigned n_args = target_func->num_args();
+ assert(n_args == 2);
+ for (unsigned arg = 0; arg < n_args; arg++) {
+ const operand_info &actual_param_op =
+ pI->operand_lookup(n_return + 1 + arg);
+ const symbol *formal_param = target_func->get_arg(arg);
+ unsigned size = formal_param->get_size_in_bytes();
+ assert(formal_param->is_param_local());
+ assert(actual_param_op.is_param_local());
+ addr_t from_addr = actual_param_op.get_symbol()->get_address();
+ unsigned long long buffer[1024];
+ assert(size < 1024 * sizeof(unsigned long long));
+ thread->m_local_mem->read(from_addr, size, buffer);
+ addr_t addr =
+ (addr_t)buffer[0]; // should be pointer to generic memory location
+ memory_space *mem = NULL;
+ memory_space_t space = generic_space;
+ decode_space(space, thread, actual_param_op, mem,
+ addr); // figure out which space
+ if (arg == 0) {
+ unsigned len = 0;
+ char b = 0;
+ do { // figure out length
+ mem->read(addr + len, 1, &b);
+ len++;
+ } while (b);
+ fmtstr = (char *)malloc(len + 64);
+ for (int i = 0; i < len; i++) mem->read(addr + i, 1, fmtstr + i);
+ // mem->read(addr,len,fmtstr);
+ } else {
+ unsigned len = thread->get_finfo()->local_mem_framesize();
+ arg_list = (char *)malloc(len + 64);
+ for (int i = 0; i < len; i++) mem->read(addr + i, 1, arg_list + i);
+ // mem->read(addr,len,arg_list);
+ }
+ }
+ my_cuda_printf(fmtstr, arg_list);
+ free(fmtstr);
+ free(arg_list);
}