nvbio-test.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. // nvbio-test.cpp
  28. //
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <nvbio/basic/types.h>
  33. #include <nvbio/basic/console.h>
  34. #include <nvbio/basic/exceptions.h>
  35. #include <nvbio/basic/cuda/arch.h>
  36. #include <cuda_runtime_api.h>
  37. int cache_test();
  38. int packedstream_test();
  39. int bwt_test();
  40. int fmindex_test(int argc, char* argv[]);
  41. int fastq_test(const char* filename);
  42. void crcInit();
  43. namespace nvbio {
  44. int alloc_test();
  45. int syncblocks_test();
  46. int condition_test();
  47. int rank_test(int argc, char* argv[]);
  48. int work_queue_test(int argc, char* argv[]);
  49. int string_set_test(int argc, char* argv[]);
  50. int sum_tree_test();
  51. int qgram_test(int argc, char* argv[]);
  52. int sequence_test(int argc, char* argv[]);
  53. int wavelet_test(int argc, char* argv[]);
  54. int bloom_filter_test(int argc, char* argv[]);
  55. namespace cuda { void scan_test(); }
  56. namespace aln { void test(int argc, char* argv[]); }
  57. namespace html { void test(); }
  58. } // namespace nvbio
  59. using namespace nvbio;
  60. enum Tests {
  61. kStringSet = 1u,
  62. kScan = 2u,
  63. kSumTree = 16u,
  64. kHTML = 32u,
  65. kCache = 64u,
  66. kPackedStream = 128u,
  67. kBWT = 256u,
  68. kFMIndex = 512u,
  69. kAlloc = 1024u,
  70. kSyncblocks = 2048u,
  71. kCondition = 4096u,
  72. kWorkQueue = 8192u,
  73. kAlignment = 16384u,
  74. kRank = 32768u,
  75. kQGram = 65536u,
  76. kSequence = 131072u,
  77. kWaveletTree = 262144u,
  78. kBloomFilter = 524288u,
  79. kALL = 0xFFFFFFFFu
  80. };
  81. int main(int argc, char* argv[])
  82. {
  83. try
  84. {
  85. crcInit();
  86. int cuda_device = -1;
  87. int device_count;
  88. cudaGetDeviceCount(&device_count);
  89. cuda::check_error("cuda-check");
  90. log_verbose(stderr, " cuda devices : %d\n", device_count);
  91. uint32 tests = kALL;
  92. int arg = 1;
  93. if (argc > 1)
  94. {
  95. if (strcmp( argv[arg], "-device" ) == 0)
  96. {
  97. cuda_device = atoi(argv[++arg]);
  98. ++arg;
  99. }
  100. if (arg < argc)
  101. {
  102. if (strcmp( argv[arg], "-string-set" ) == 0)
  103. tests = kStringSet;
  104. else if (strcmp( argv[arg], "-scan" ) == 0)
  105. tests = kScan;
  106. else if (strcmp( argv[arg], "-sum-tree" ) == 0)
  107. tests = kSumTree;
  108. else if (strcmp( argv[arg], "-aln" ) == 0)
  109. tests = kAlignment;
  110. else if (strcmp( argv[arg], "-html" ) == 0)
  111. tests = kHTML;
  112. else if (strcmp( argv[arg], "-cache" ) == 0)
  113. tests = kCache;
  114. else if (strcmp( argv[arg], "-packed-stream" ) == 0)
  115. tests = kPackedStream;
  116. else if (strcmp( argv[arg], "-bwt" ) == 0)
  117. tests = kBWT;
  118. else if (strcmp( argv[arg], "-rank" ) == 0)
  119. tests = kRank;
  120. else if (strcmp( argv[arg], "-fm-index" ) == 0)
  121. tests = kFMIndex;
  122. else if (strcmp( argv[arg], "-qgram" ) == 0)
  123. tests = kQGram;
  124. else if (strcmp( argv[arg], "-alloc" ) == 0)
  125. tests = kAlloc;
  126. else if (strcmp( argv[arg], "-syncblocks" ) == 0)
  127. tests = kSyncblocks;
  128. else if (strcmp( argv[arg], "-condition" ) == 0)
  129. tests = kCondition;
  130. else if (strcmp( argv[arg], "-work-queue" ) == 0)
  131. tests = kWorkQueue;
  132. else if (strcmp( argv[arg], "-sequence" ) == 0)
  133. tests = kSequence;
  134. else if (strcmp( argv[arg], "-wavelet" ) == 0)
  135. tests = kWaveletTree;
  136. else if (strcmp( argv[arg], "-bloom-filter" ) == 0)
  137. tests = kBloomFilter;
  138. ++arg;
  139. }
  140. }
  141. // inspect and select cuda devices
  142. if (device_count)
  143. {
  144. if (cuda_device == -1)
  145. {
  146. int best_device = 0;
  147. cudaDeviceProp best_device_prop;
  148. cudaGetDeviceProperties( &best_device_prop, best_device );
  149. for (int device = 0; device < device_count; ++device)
  150. {
  151. cudaDeviceProp device_prop;
  152. cudaGetDeviceProperties( &device_prop, device );
  153. log_verbose(stderr, " device %d has compute capability %d.%d\n", device, device_prop.major, device_prop.minor);
  154. log_verbose(stderr, " SM count : %u\n", device_prop.multiProcessorCount);
  155. log_verbose(stderr, " SM clock rate : %u Mhz\n", device_prop.clockRate / 1000);
  156. log_verbose(stderr, " memory clock rate : %.1f Ghz\n", float(device_prop.memoryClockRate) * 1.0e-6f);
  157. if (device_prop.major >= best_device_prop.major &&
  158. device_prop.minor >= best_device_prop.minor)
  159. {
  160. best_device_prop = device_prop;
  161. best_device = device;
  162. }
  163. }
  164. cuda_device = best_device;
  165. }
  166. log_verbose(stderr, " chosen device %d\n", cuda_device);
  167. {
  168. cudaDeviceProp device_prop;
  169. cudaGetDeviceProperties( &device_prop, cuda_device );
  170. log_verbose(stderr, " device name : %s\n", device_prop.name);
  171. log_verbose(stderr, " compute capability : %d.%d\n", device_prop.major, device_prop.minor);
  172. }
  173. cudaSetDevice( cuda_device );
  174. }
  175. // allocate some heap
  176. cudaDeviceSetLimit( cudaLimitMallocHeapSize, 128*1024*1024 );
  177. argc = argc >= arg ? argc-arg : 0;
  178. if (tests & kAlloc) alloc_test();
  179. if (tests & kSyncblocks) syncblocks_test();
  180. if (tests & kCondition) condition_test();
  181. if (tests & kWorkQueue) work_queue_test( argc, argv+arg );
  182. if (tests & kStringSet) string_set_test( argc, argv+arg );
  183. if (tests & kScan) cuda::scan_test();
  184. if (tests & kAlignment) aln::test( argc, argv+arg );
  185. if (tests & kSumTree) sum_tree_test();
  186. if (tests & kHTML) html::test();
  187. if (tests & kCache) cache_test();
  188. if (tests & kPackedStream) packedstream_test();
  189. if (tests & kBWT) bwt_test();
  190. if (tests & kRank) rank_test( argc, argv+arg );
  191. if (tests & kFMIndex) fmindex_test( argc, argv+arg );
  192. if (tests & kQGram) qgram_test( argc, argv+arg );
  193. if (tests & kSequence) sequence_test( argc, argv+arg );
  194. if (tests & kWaveletTree) wavelet_test( argc, argv+arg );
  195. if (tests & kBloomFilter) bloom_filter_test( argc, argv+arg );
  196. cudaDeviceReset();
  197. return 0;
  198. }
  199. catch (nvbio::cuda_error e)
  200. {
  201. log_error(stderr, "caught a nvbio::cuda_error exception:\n");
  202. log_error(stderr, " %s\n", e.what());
  203. return 1;
  204. }
  205. catch (nvbio::bad_alloc e)
  206. {
  207. log_error(stderr, "caught a nvbio::bad_alloc exception:\n");
  208. log_error(stderr, " %s\n", e.what());
  209. return 1;
  210. }
  211. catch (nvbio::logic_error e)
  212. {
  213. log_error(stderr, "caught a nvbio::logic_error exception:\n");
  214. log_error(stderr, " %s\n", e.what());
  215. return 1;
  216. }
  217. catch (nvbio::runtime_error e)
  218. {
  219. log_error(stderr, "caught a nvbio::runtime_error exception:\n");
  220. log_error(stderr, " %s\n", e.what());
  221. return 1;
  222. }
  223. catch (std::bad_alloc e)
  224. {
  225. log_error(stderr, "caught a std::bad_alloc exception:\n");
  226. log_error(stderr, " %s\n", e.what());
  227. return 1;
  228. }
  229. catch (std::logic_error e)
  230. {
  231. log_error(stderr, "caught a std::logic_error exception:\n");
  232. log_error(stderr, " %s\n", e.what());
  233. return 1;
  234. }
  235. catch (std::runtime_error e)
  236. {
  237. log_error(stderr, "caught a std::runtime_error exception:\n");
  238. log_error(stderr, " %s\n", e.what());
  239. return 1;
  240. }
  241. catch (...)
  242. {
  243. log_error(stderr, "caught an unknown exception!\n");
  244. return 1;
  245. }
  246. }