diff options
| author | Nick <[email protected]> | 2019-09-13 07:54:00 -0400 |
|---|---|---|
| committer | Nick <[email protected]> | 2019-09-13 07:54:00 -0400 |
| commit | a34a4baad45a40840308167307c79371b4024a9d (patch) | |
| tree | c9bef005b3a42ba7d65173ef68aba8eedfbb35d9 /src/cuda-sim/memory.cc | |
| parent | ae63df6d86f995876f38ab3cdf47eac61ccda8cd (diff) | |
Big reformat change using clang-format-6.0
Diffstat (limited to 'src/cuda-sim/memory.cc')
| -rw-r--r-- | src/cuda-sim/memory.cc | 345 |
1 files changed, 181 insertions, 164 deletions
diff --git a/src/cuda-sim/memory.cc b/src/cuda-sim/memory.cc index 4b2acdf..1323837 100644 --- a/src/cuda-sim/memory.cc +++ b/src/cuda-sim/memory.cc @@ -7,210 +7,227 @@ // // 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 "memory.h" #include <stdlib.h> -#include "../debug.h" #include "../../libcuda/gpgpu_context.h" +#include "../debug.h" -template<unsigned BSIZE> memory_space_impl<BSIZE>::memory_space_impl( std::string name, unsigned hash_size ) -{ - m_name = name; - MEM_MAP_RESIZE(hash_size); +template <unsigned BSIZE> +memory_space_impl<BSIZE>::memory_space_impl(std::string name, + unsigned hash_size) { + m_name = name; + MEM_MAP_RESIZE(hash_size); - m_log2_block_size = -1; - for( unsigned n=0, mask=1; mask != 0; mask <<= 1, n++ ) { - if( BSIZE & mask ) { - assert( m_log2_block_size == (unsigned)-1 ); - m_log2_block_size = n; - } - } - assert( m_log2_block_size != (unsigned)-1 ); + m_log2_block_size = -1; + for (unsigned n = 0, mask = 1; mask != 0; mask <<= 1, n++) { + if (BSIZE & mask) { + assert(m_log2_block_size == (unsigned)-1); + m_log2_block_size = n; + } + } + assert(m_log2_block_size != (unsigned)-1); } -template<unsigned BSIZE> void memory_space_impl<BSIZE>::write_only( mem_addr_t offset, mem_addr_t index, size_t length, const void *data) -{ - m_data[index].write(offset,length,(const unsigned char*)data); +template <unsigned BSIZE> +void memory_space_impl<BSIZE>::write_only(mem_addr_t offset, mem_addr_t index, + size_t length, const void *data) { + m_data[index].write(offset, length, (const unsigned char *)data); } -template<unsigned BSIZE> void memory_space_impl<BSIZE>::write( mem_addr_t addr, size_t length, const void *data, class ptx_thread_info *thd, const ptx_instruction *pI) -{ +template <unsigned BSIZE> +void memory_space_impl<BSIZE>::write(mem_addr_t addr, size_t length, + const void *data, + class ptx_thread_info *thd, + const ptx_instruction *pI) { + mem_addr_t index = addr >> m_log2_block_size; - mem_addr_t index = addr >> m_log2_block_size; + if ((addr + length) <= (index + 1) * BSIZE) { + // fast route for intra-block access + unsigned offset = addr & (BSIZE - 1); + unsigned nbytes = length; + m_data[index].write(offset, nbytes, (const unsigned char *)data); + } else { + // slow route for inter-block access + unsigned nbytes_remain = length; + unsigned src_offset = 0; + mem_addr_t current_addr = addr; - if ( (addr+length) <= (index+1)*BSIZE ) { - // fast route for intra-block access - unsigned offset = addr & (BSIZE-1); - unsigned nbytes = length; - m_data[index].write(offset,nbytes,(const unsigned char*)data); - } else { - // slow route for inter-block access - unsigned nbytes_remain = length; - unsigned src_offset = 0; - mem_addr_t current_addr = addr; + while (nbytes_remain > 0) { + unsigned offset = current_addr & (BSIZE - 1); + mem_addr_t page = current_addr >> m_log2_block_size; + mem_addr_t access_limit = offset + nbytes_remain; + if (access_limit > BSIZE) { + access_limit = BSIZE; + } - while (nbytes_remain > 0) { - unsigned offset = current_addr & (BSIZE-1); - mem_addr_t page = current_addr >> m_log2_block_size; - mem_addr_t access_limit = offset + nbytes_remain; - if (access_limit > BSIZE) { - access_limit = BSIZE; - } - - size_t tx_bytes = access_limit - offset; - m_data[page].write(offset, tx_bytes, &((const unsigned char*)data)[src_offset]); + size_t tx_bytes = access_limit - offset; + m_data[page].write(offset, tx_bytes, + &((const unsigned char *)data)[src_offset]); - // advance pointers - src_offset += tx_bytes; - current_addr += tx_bytes; - nbytes_remain -= tx_bytes; - } - assert(nbytes_remain == 0); - } - if( !m_watchpoints.empty() ) { - std::map<unsigned,mem_addr_t>::iterator i; - for( i=m_watchpoints.begin(); i!=m_watchpoints.end(); i++ ) { - mem_addr_t wa = i->second; - if( ((addr<=wa) && ((addr+length)>wa)) || ((addr>wa) && (addr < (wa+4))) ) - thd->get_gpu()->gpgpu_ctx->the_gpgpusim->g_the_gpu->hit_watchpoint(i->first,thd,pI); - } - } + // advance pointers + src_offset += tx_bytes; + current_addr += tx_bytes; + nbytes_remain -= tx_bytes; + } + assert(nbytes_remain == 0); + } + if (!m_watchpoints.empty()) { + std::map<unsigned, mem_addr_t>::iterator i; + for (i = m_watchpoints.begin(); i != m_watchpoints.end(); i++) { + mem_addr_t wa = i->second; + if (((addr <= wa) && ((addr + length) > wa)) || + ((addr > wa) && (addr < (wa + 4)))) + thd->get_gpu()->gpgpu_ctx->the_gpgpusim->g_the_gpu->hit_watchpoint( + i->first, thd, pI); + } + } } -template<unsigned BSIZE> void memory_space_impl<BSIZE>::read_single_block( mem_addr_t blk_idx, mem_addr_t addr, size_t length, void *data) const -{ - if ((addr + length) > (blk_idx + 1) * BSIZE) { - printf("GPGPU-Sim PTX: ERROR * access to memory \'%s\' is unaligned : addr=0x%x, length=%zu\n", - m_name.c_str(), addr, length); - printf("GPGPU-Sim PTX: (addr+length)=0x%lx > 0x%x=(index+1)*BSIZE, index=0x%x, BSIZE=0x%x\n", - (addr+length),(blk_idx+1)*BSIZE, blk_idx, BSIZE); - throw 1; - } - typename map_t::const_iterator i = m_data.find(blk_idx); - if( i == m_data.end() ) { - for( size_t n=0; n < length; n++ ) - ((unsigned char*)data)[n] = (unsigned char) 0; - //printf("GPGPU-Sim PTX: WARNING reading %zu bytes from unititialized memory at address 0x%x in space %s\n", length, addr, m_name.c_str() ); - } else { - unsigned offset = addr & (BSIZE-1); - unsigned nbytes = length; - i->second.read(offset,nbytes,(unsigned char*)data); - } +template <unsigned BSIZE> +void memory_space_impl<BSIZE>::read_single_block(mem_addr_t blk_idx, + mem_addr_t addr, size_t length, + void *data) const { + if ((addr + length) > (blk_idx + 1) * BSIZE) { + printf( + "GPGPU-Sim PTX: ERROR * access to memory \'%s\' is unaligned : " + "addr=0x%x, length=%zu\n", + m_name.c_str(), addr, length); + printf( + "GPGPU-Sim PTX: (addr+length)=0x%lx > 0x%x=(index+1)*BSIZE, " + "index=0x%x, BSIZE=0x%x\n", + (addr + length), (blk_idx + 1) * BSIZE, blk_idx, BSIZE); + throw 1; + } + typename map_t::const_iterator i = m_data.find(blk_idx); + if (i == m_data.end()) { + for (size_t n = 0; n < length; n++) + ((unsigned char *)data)[n] = (unsigned char)0; + // printf("GPGPU-Sim PTX: WARNING reading %zu bytes from unititialized + // memory at address 0x%x in space %s\n", length, addr, m_name.c_str() ); + } else { + unsigned offset = addr & (BSIZE - 1); + unsigned nbytes = length; + i->second.read(offset, nbytes, (unsigned char *)data); + } } -template<unsigned BSIZE> void memory_space_impl<BSIZE>::read( mem_addr_t addr, size_t length, void *data ) const -{ - mem_addr_t index = addr >> m_log2_block_size; - if ((addr+length) <= (index+1)*BSIZE ) { - // fast route for intra-block access - read_single_block(index, addr, length, data); - } else { - // slow route for inter-block access - unsigned nbytes_remain = length; - unsigned dst_offset = 0; - mem_addr_t current_addr = addr; +template <unsigned BSIZE> +void memory_space_impl<BSIZE>::read(mem_addr_t addr, size_t length, + void *data) const { + mem_addr_t index = addr >> m_log2_block_size; + if ((addr + length) <= (index + 1) * BSIZE) { + // fast route for intra-block access + read_single_block(index, addr, length, data); + } else { + // slow route for inter-block access + unsigned nbytes_remain = length; + unsigned dst_offset = 0; + mem_addr_t current_addr = addr; - while (nbytes_remain > 0) { - unsigned offset = current_addr & (BSIZE-1); - mem_addr_t page = current_addr >> m_log2_block_size; - mem_addr_t access_limit = offset + nbytes_remain; - if (access_limit > BSIZE) { - access_limit = BSIZE; - } - - size_t tx_bytes = access_limit - offset; - read_single_block(page, current_addr, tx_bytes, &((unsigned char*)data)[dst_offset]); - - // advance pointers - dst_offset += tx_bytes; - current_addr += tx_bytes; - nbytes_remain -= tx_bytes; + while (nbytes_remain > 0) { + unsigned offset = current_addr & (BSIZE - 1); + mem_addr_t page = current_addr >> m_log2_block_size; + mem_addr_t access_limit = offset + nbytes_remain; + if (access_limit > BSIZE) { + access_limit = BSIZE; } - assert(nbytes_remain == 0); - } + + size_t tx_bytes = access_limit - offset; + read_single_block(page, current_addr, tx_bytes, + &((unsigned char *)data)[dst_offset]); + + // advance pointers + dst_offset += tx_bytes; + current_addr += tx_bytes; + nbytes_remain -= tx_bytes; + } + assert(nbytes_remain == 0); + } } -template<unsigned BSIZE> void memory_space_impl<BSIZE>::print( const char *format, FILE *fout ) const -{ - typename map_t::const_iterator i_page; +template <unsigned BSIZE> +void memory_space_impl<BSIZE>::print(const char *format, FILE *fout) const { + typename map_t::const_iterator i_page; - for ( i_page = m_data.begin(); i_page != m_data.end(); ++i_page) { - fprintf(fout, "%s %08x:", m_name.c_str(), i_page->first); - i_page->second.print(format, fout); - } + for (i_page = m_data.begin(); i_page != m_data.end(); ++i_page) { + fprintf(fout, "%s %08x:", m_name.c_str(), i_page->first); + i_page->second.print(format, fout); + } } -template<unsigned BSIZE> void memory_space_impl<BSIZE>::set_watch( addr_t addr, unsigned watchpoint ) -{ - m_watchpoints[watchpoint]=addr; +template <unsigned BSIZE> +void memory_space_impl<BSIZE>::set_watch(addr_t addr, unsigned watchpoint) { + m_watchpoints[watchpoint] = addr; } template class memory_space_impl<32>; template class memory_space_impl<64>; template class memory_space_impl<8192>; -template class memory_space_impl<16*1024>; +template class memory_space_impl<16 * 1024>; -void g_print_memory_space(memory_space *mem, const char *format = "%08x", FILE *fout = stdout) -{ - mem->print(format,fout); +void g_print_memory_space(memory_space *mem, const char *format = "%08x", + FILE *fout = stdout) { + mem->print(format, fout); } #ifdef UNIT_TEST -int main(int argc, char *argv[] ) -{ - int errors_found=0; - memory_space *mem = new memory_space_impl<32>("test",4); - // write address to [address] - for( mem_addr_t addr=0; addr < 16*1024; addr+=4) - mem->write(addr,4,&addr,NULL,NULL); +int main(int argc, char *argv[]) { + int errors_found = 0; + memory_space *mem = new memory_space_impl<32>("test", 4); + // write address to [address] + for (mem_addr_t addr = 0; addr < 16 * 1024; addr += 4) + mem->write(addr, 4, &addr, NULL, NULL); - for( mem_addr_t addr=0; addr < 16*1024; addr+=4) { - unsigned tmp=0; - mem->read(addr,4,&tmp); - if( tmp != addr ) { - errors_found=1; - printf("ERROR ** mem[0x%x] = 0x%x, expected 0x%x\n", addr, tmp, addr ); - } - } + for (mem_addr_t addr = 0; addr < 16 * 1024; addr += 4) { + unsigned tmp = 0; + mem->read(addr, 4, &tmp); + if (tmp != addr) { + errors_found = 1; + printf("ERROR ** mem[0x%x] = 0x%x, expected 0x%x\n", addr, tmp, addr); + } + } - for( mem_addr_t addr=0; addr < 16*1024; addr+=1) { - unsigned char val = (addr + 128) % 256; - mem->write(addr,1,&val,NULL,NULL); - } + for (mem_addr_t addr = 0; addr < 16 * 1024; addr += 1) { + unsigned char val = (addr + 128) % 256; + mem->write(addr, 1, &val, NULL, NULL); + } - for( mem_addr_t addr=0; addr < 16*1024; addr+=1) { - unsigned tmp=0; - mem->read(addr,1,&tmp); - unsigned char val = (addr + 128) % 256; - if( tmp != val ) { - errors_found=1; - printf("ERROR ** mem[0x%x] = 0x%x, expected 0x%x\n", addr, tmp, (unsigned)val ); - } - } + for (mem_addr_t addr = 0; addr < 16 * 1024; addr += 1) { + unsigned tmp = 0; + mem->read(addr, 1, &tmp); + unsigned char val = (addr + 128) % 256; + if (tmp != val) { + errors_found = 1; + printf("ERROR ** mem[0x%x] = 0x%x, expected 0x%x\n", addr, tmp, + (unsigned)val); + } + } - if( errors_found ) { - printf("SUMMARY: ERRORS FOUND\n"); - } else { - printf("SUMMARY: UNIT TEST PASSED\n"); - } + if (errors_found) { + printf("SUMMARY: ERRORS FOUND\n"); + } else { + printf("SUMMARY: UNIT TEST PASSED\n"); + } } #endif |
