utils.h 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * nvbio
  3. * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of the NVIDIA CORPORATION nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #pragma once
  28. #include <nvbio/basic/packedstream.h>
  29. #include <nvbio/basic/cached_iterator.h>
  30. #include <nvbio/basic/vector_view.h>
  31. namespace nvbio {
  32. template <typename StringType>
  33. struct lmem_selector {};
  34. template <typename StreamType,
  35. typename SymbolType,
  36. uint32 SYMBOL_SIZE_T,
  37. bool BIG_ENDIAN_T>
  38. struct lmem_selector< vector_view< PackedStream<StreamType,SymbolType,SYMBOL_SIZE_T,BIG_ENDIAN_T> > >
  39. {
  40. typedef typename std::iterator_traits<StreamType>::value_type type;
  41. static const uint32 SYMBOLS_PER_WORD = (sizeof(type)*8)/SYMBOL_SIZE_T;
  42. static const uint32 WORDS = 512 / SYMBOLS_PER_WORD;
  43. };
  44. template <typename StreamType,
  45. typename SymbolType,
  46. uint32 SYMBOL_SIZE_T,
  47. bool BIG_ENDIAN_T,
  48. typename W>
  49. NVBIO_FORCEINLINE NVBIO_HOST_DEVICE
  50. vector_view< typename PackedStream<const_cached_iterator<const W*>,SymbolType,SYMBOL_SIZE_T,BIG_ENDIAN_T>::iterator >
  51. make_local_string(
  52. vector_view< PackedStream<StreamType,SymbolType,SYMBOL_SIZE_T,BIG_ENDIAN_T> > string,
  53. W* lmem)
  54. {
  55. const StreamType in_stream = string.begin().stream();
  56. const uint32 in_offset = string.begin().index();
  57. const uint32 N = string.length();
  58. typedef typename std::iterator_traits<StreamType>::value_type word_type;
  59. const uint32 SYMBOLS_PER_WORD = (sizeof(word_type)*8) / SYMBOL_SIZE_T;
  60. uint32 word_offset = in_offset & (SYMBOLS_PER_WORD-1);
  61. uint32 begin_word = in_offset / SYMBOLS_PER_WORD;
  62. uint32 end_word = (in_offset + N + SYMBOLS_PER_WORD-1) / SYMBOLS_PER_WORD;
  63. for (uint32 word = begin_word; word < end_word; ++word)
  64. lmem[word - begin_word] = in_stream[ word ];
  65. typedef PackedStream<const_cached_iterator<const W*>,uint8,SYMBOL_SIZE_T,BIG_ENDIAN_T> const_stream_type;
  66. const_stream_type clmem_stream( lmem );
  67. return vector_view<const_stream_type>( N, clmem_stream + word_offset );
  68. }
  69. } // namespace nvbio