state.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include "state.h"
  4. #include "../../common/lexers/streamfilters.h"
  5. namespace embree
  6. {
  7. MutexSys g_printMutex;
  8. State::ErrorHandler State::g_errorHandler;
  9. State::ErrorHandler::ErrorHandler()
  10. : thread_error(createTls()) {}
  11. State::ErrorHandler::~ErrorHandler()
  12. {
  13. Lock<MutexSys> lock(errors_mutex);
  14. for (size_t i=0; i<thread_errors.size(); i++) {
  15. delete thread_errors[i];
  16. }
  17. destroyTls(thread_error);
  18. thread_errors.clear();
  19. }
  20. RTCErrorMessage* State::ErrorHandler::error()
  21. {
  22. RTCErrorMessage* stored_error = (RTCErrorMessage*) getTls(thread_error);
  23. if (stored_error) {
  24. return stored_error;
  25. }
  26. Lock<MutexSys> lock(errors_mutex);
  27. stored_error = new RTCErrorMessage(RTC_ERROR_NONE, "");
  28. thread_errors.push_back(stored_error);
  29. setTls(thread_error,stored_error);
  30. return stored_error;
  31. }
  32. State::State ()
  33. : enabled_cpu_features(getCPUFeatures()),
  34. enabled_builder_cpu_features(enabled_cpu_features),
  35. frequency_level(FREQUENCY_SIMD256)
  36. {
  37. tri_accel = "default";
  38. tri_builder = "default";
  39. tri_traverser = "default";
  40. tri_accel_mb = "default";
  41. tri_builder_mb = "default";
  42. tri_traverser_mb = "default";
  43. quad_accel = "default";
  44. quad_builder = "default";
  45. quad_traverser = "default";
  46. quad_accel_mb = "default";
  47. quad_builder_mb = "default";
  48. quad_traverser_mb = "default";
  49. line_accel = "default";
  50. line_builder = "default";
  51. line_traverser = "default";
  52. line_accel_mb = "default";
  53. line_builder_mb = "default";
  54. line_traverser_mb = "default";
  55. hair_accel = "default";
  56. hair_builder = "default";
  57. hair_traverser = "default";
  58. hair_accel_mb = "default";
  59. hair_builder_mb = "default";
  60. hair_traverser_mb = "default";
  61. object_accel = "default";
  62. object_builder = "default";
  63. object_accel_min_leaf_size = 1;
  64. object_accel_max_leaf_size = 1;
  65. object_accel_mb = "default";
  66. object_builder_mb = "default";
  67. object_accel_mb_min_leaf_size = 1;
  68. object_accel_mb_max_leaf_size = 1;
  69. max_spatial_split_replications = 1.2f;
  70. useSpatialPreSplits = false;
  71. max_triangles_per_leaf = inf;
  72. tessellation_cache_size = 128*1024*1024;
  73. subdiv_accel = "default";
  74. subdiv_accel_mb = "default";
  75. grid_accel = "default";
  76. grid_builder = "default";
  77. grid_accel_mb = "default";
  78. grid_builder_mb = "default";
  79. instancing_open_min = 0;
  80. instancing_block_size = 0;
  81. instancing_open_factor = 8.0f;
  82. instancing_open_max_depth = 32;
  83. instancing_open_max = 50000000;
  84. float_exceptions = false;
  85. quality_flags = -1;
  86. scene_flags = -1;
  87. verbose = 0;
  88. benchmark = 0;
  89. numThreads = 0;
  90. numUserThreads = 0;
  91. #if TASKING_INTERNAL
  92. set_affinity = true;
  93. #else
  94. set_affinity = false;
  95. #endif
  96. start_threads = false;
  97. enable_selockmemoryprivilege = false;
  98. #if defined(__LINUX__)
  99. hugepages = true;
  100. #else
  101. hugepages = false;
  102. #endif
  103. hugepages_success = true;
  104. alloc_main_block_size = 0;
  105. alloc_num_main_slots = 0;
  106. alloc_thread_block_size = 0;
  107. alloc_single_thread_alloc = -1;
  108. error_function = nullptr;
  109. error_function_userptr = nullptr;
  110. memory_monitor_function = nullptr;
  111. memory_monitor_userptr = nullptr;
  112. }
  113. State::~State() {
  114. }
  115. bool State::hasISA(const int isa) {
  116. return (enabled_cpu_features & isa) == isa;
  117. }
  118. bool State::checkISASupport() {
  119. #if defined(__ARM_NEON)
  120. /*
  121. * NEON CPU type is a mixture of NEON and SSE2
  122. */
  123. bool hasSSE2 = (getCPUFeatures() & enabled_cpu_features) & CPU_FEATURE_SSE2;
  124. /* this will be true when explicitly initialize Device with `isa=neon` config */
  125. bool hasNEON = (getCPUFeatures() & enabled_cpu_features) & CPU_FEATURE_NEON;
  126. return hasSSE2 || hasNEON;
  127. #else
  128. return (getCPUFeatures() & enabled_cpu_features) == enabled_cpu_features;
  129. #endif
  130. }
  131. void State::verify()
  132. {
  133. /* verify that calculations stay in range */
  134. assert(rcp(min_rcp_input)*FLT_LARGE+FLT_LARGE < 0.01f*FLT_MAX);
  135. /* here we verify that CPP files compiled for a specific ISA only
  136. * call that same or lower ISA version of non-inlined class member
  137. * functions */
  138. #if defined(DEBUG)
  139. #if defined(EMBREE_TARGET_SSE2)
  140. #if !defined(__ARM_NEON)
  141. assert(sse2::getISA() <= SSE2);
  142. #endif
  143. #endif
  144. #if defined(EMBREE_TARGET_SSE42)
  145. assert(sse42::getISA() <= SSE42);
  146. #endif
  147. #if defined(EMBREE_TARGET_AVX)
  148. assert(avx::getISA() <= AVX);
  149. #endif
  150. #if defined(EMBREE_TARGET_AVX2)
  151. assert(avx2::getISA() <= AVX2);
  152. #endif
  153. #if defined (EMBREE_TARGET_AVX512)
  154. assert(avx512::getISA() <= AVX512);
  155. #endif
  156. #endif
  157. }
  158. const char* symbols[3] = { "=", ",", "|" };
  159. bool State::parseFile(const FileName& fileName)
  160. {
  161. Ref<Stream<int> > file;
  162. //try {
  163. file = new FileStream(fileName);
  164. //}
  165. //catch (std::runtime_error& e) {
  166. // (void) e;
  167. // return false;
  168. //}
  169. std::vector<std::string> syms;
  170. for (size_t i=0; i<sizeof(symbols)/sizeof(void*); i++)
  171. syms.push_back(symbols[i]);
  172. Ref<TokenStream> cin = new TokenStream(new LineCommentFilter(file,"#"),
  173. TokenStream::alpha+TokenStream::ALPHA+TokenStream::numbers+"_.",
  174. TokenStream::separators,syms);
  175. parse(cin);
  176. return true;
  177. }
  178. void State::parseString(const char* cfg)
  179. {
  180. if (cfg == nullptr) return;
  181. std::vector<std::string> syms;
  182. for (size_t i=0; i<sizeof(symbols)/sizeof(void*); i++)
  183. syms.push_back(symbols[i]);
  184. Ref<TokenStream> cin = new TokenStream(new StrStream(cfg),
  185. TokenStream::alpha+TokenStream::ALPHA+TokenStream::numbers+"_.",
  186. TokenStream::separators,syms);
  187. parse(cin);
  188. }
  189. int string_to_cpufeatures(const std::string& isa)
  190. {
  191. if (isa == "sse" ) return SSE;
  192. else if (isa == "sse2") return SSE2;
  193. else if (isa == "sse3") return SSE3;
  194. else if (isa == "ssse3") return SSSE3;
  195. else if (isa == "sse41") return SSE41;
  196. else if (isa == "sse4.1") return SSE41;
  197. else if (isa == "sse42") return SSE42;
  198. else if (isa == "sse4.2") return SSE42;
  199. else if (isa == "avx") return AVX;
  200. else if (isa == "avxi") return AVXI;
  201. else if (isa == "avx2") return AVX2;
  202. else if (isa == "avx512") return AVX512;
  203. else return SSE2;
  204. }
  205. void State::parse(Ref<TokenStream> cin)
  206. {
  207. /* parse until end of stream */
  208. while (cin->peek() != Token::Eof())
  209. {
  210. const Token tok = cin->get();
  211. if (tok == Token::Id("threads") && cin->trySymbol("="))
  212. numThreads = cin->get().Int();
  213. else if (tok == Token::Id("user_threads")&& cin->trySymbol("="))
  214. numUserThreads = cin->get().Int();
  215. else if (tok == Token::Id("set_affinity")&& cin->trySymbol("="))
  216. set_affinity = cin->get().Int();
  217. else if (tok == Token::Id("affinity")&& cin->trySymbol("="))
  218. set_affinity = cin->get().Int();
  219. else if (tok == Token::Id("start_threads")&& cin->trySymbol("="))
  220. start_threads = cin->get().Int();
  221. else if (tok == Token::Id("isa") && cin->trySymbol("=")) {
  222. std::string isa_str = toLowerCase(cin->get().Identifier());
  223. enabled_cpu_features = string_to_cpufeatures(isa_str);
  224. enabled_builder_cpu_features = enabled_cpu_features;
  225. }
  226. else if (tok == Token::Id("max_isa") && cin->trySymbol("=")) {
  227. std::string isa_str = toLowerCase(cin->get().Identifier());
  228. enabled_cpu_features &= string_to_cpufeatures(isa_str);
  229. enabled_builder_cpu_features &= enabled_cpu_features;
  230. }
  231. else if (tok == Token::Id("max_builder_isa") && cin->trySymbol("=")) {
  232. std::string isa_str = toLowerCase(cin->get().Identifier());
  233. enabled_builder_cpu_features &= string_to_cpufeatures(isa_str);
  234. }
  235. else if (tok == Token::Id("frequency_level") && cin->trySymbol("=")) {
  236. std::string freq = cin->get().Identifier();
  237. if (freq == "simd128") frequency_level = FREQUENCY_SIMD128;
  238. else if (freq == "simd256") frequency_level = FREQUENCY_SIMD256;
  239. else if (freq == "simd512") frequency_level = FREQUENCY_SIMD512;
  240. }
  241. else if (tok == Token::Id("enable_selockmemoryprivilege") && cin->trySymbol("=")) {
  242. enable_selockmemoryprivilege = cin->get().Int();
  243. }
  244. else if (tok == Token::Id("hugepages") && cin->trySymbol("=")) {
  245. hugepages = cin->get().Int();
  246. }
  247. else if (tok == Token::Id("float_exceptions") && cin->trySymbol("="))
  248. float_exceptions = cin->get().Int();
  249. else if ((tok == Token::Id("tri_accel") || tok == Token::Id("accel")) && cin->trySymbol("="))
  250. tri_accel = cin->get().Identifier();
  251. else if ((tok == Token::Id("tri_builder") || tok == Token::Id("builder")) && cin->trySymbol("="))
  252. tri_builder = cin->get().Identifier();
  253. else if ((tok == Token::Id("tri_traverser") || tok == Token::Id("traverser")) && cin->trySymbol("="))
  254. tri_traverser = cin->get().Identifier();
  255. else if ((tok == Token::Id("tri_accel_mb") || tok == Token::Id("accel_mb")) && cin->trySymbol("="))
  256. tri_accel_mb = cin->get().Identifier();
  257. else if ((tok == Token::Id("tri_builder_mb") || tok == Token::Id("builder_mb")) && cin->trySymbol("="))
  258. tri_builder_mb = cin->get().Identifier();
  259. else if ((tok == Token::Id("tri_traverser_mb") || tok == Token::Id("traverser_mb")) && cin->trySymbol("="))
  260. tri_traverser_mb = cin->get().Identifier();
  261. else if ((tok == Token::Id("quad_accel")) && cin->trySymbol("="))
  262. quad_accel = cin->get().Identifier();
  263. else if ((tok == Token::Id("quad_builder")) && cin->trySymbol("="))
  264. quad_builder = cin->get().Identifier();
  265. else if ((tok == Token::Id("quad_traverser")) && cin->trySymbol("="))
  266. quad_traverser = cin->get().Identifier();
  267. else if ((tok == Token::Id("quad_accel_mb")) && cin->trySymbol("="))
  268. quad_accel_mb = cin->get().Identifier();
  269. else if ((tok == Token::Id("quad_builder_mb")) && cin->trySymbol("="))
  270. quad_builder_mb = cin->get().Identifier();
  271. else if ((tok == Token::Id("quad_traverser_mb")) && cin->trySymbol("="))
  272. quad_traverser_mb = cin->get().Identifier();
  273. else if ((tok == Token::Id("line_accel")) && cin->trySymbol("="))
  274. line_accel = cin->get().Identifier();
  275. else if ((tok == Token::Id("line_builder")) && cin->trySymbol("="))
  276. line_builder = cin->get().Identifier();
  277. else if ((tok == Token::Id("line_traverser")) && cin->trySymbol("="))
  278. line_traverser = cin->get().Identifier();
  279. else if ((tok == Token::Id("line_accel_mb")) && cin->trySymbol("="))
  280. line_accel_mb = cin->get().Identifier();
  281. else if ((tok == Token::Id("line_builder_mb")) && cin->trySymbol("="))
  282. line_builder_mb = cin->get().Identifier();
  283. else if ((tok == Token::Id("line_traverser_mb")) && cin->trySymbol("="))
  284. line_traverser_mb = cin->get().Identifier();
  285. else if (tok == Token::Id("hair_accel") && cin->trySymbol("="))
  286. hair_accel = cin->get().Identifier();
  287. else if (tok == Token::Id("hair_builder") && cin->trySymbol("="))
  288. hair_builder = cin->get().Identifier();
  289. else if (tok == Token::Id("hair_traverser") && cin->trySymbol("="))
  290. hair_traverser = cin->get().Identifier();
  291. else if (tok == Token::Id("hair_accel_mb") && cin->trySymbol("="))
  292. hair_accel_mb = cin->get().Identifier();
  293. else if (tok == Token::Id("hair_builder_mb") && cin->trySymbol("="))
  294. hair_builder_mb = cin->get().Identifier();
  295. else if (tok == Token::Id("hair_traverser_mb") && cin->trySymbol("="))
  296. hair_traverser_mb = cin->get().Identifier();
  297. else if (tok == Token::Id("object_accel") && cin->trySymbol("="))
  298. object_accel = cin->get().Identifier();
  299. else if (tok == Token::Id("object_builder") && cin->trySymbol("="))
  300. object_builder = cin->get().Identifier();
  301. else if (tok == Token::Id("object_accel_min_leaf_size") && cin->trySymbol("="))
  302. object_accel_min_leaf_size = cin->get().Int();
  303. else if (tok == Token::Id("object_accel_max_leaf_size") && cin->trySymbol("="))
  304. object_accel_max_leaf_size = cin->get().Int();
  305. else if (tok == Token::Id("object_accel_mb") && cin->trySymbol("="))
  306. object_accel_mb = cin->get().Identifier();
  307. else if (tok == Token::Id("object_builder_mb") && cin->trySymbol("="))
  308. object_builder_mb = cin->get().Identifier();
  309. else if (tok == Token::Id("object_accel_mb_min_leaf_size") && cin->trySymbol("="))
  310. object_accel_mb_min_leaf_size = cin->get().Int();
  311. else if (tok == Token::Id("object_accel_mb_max_leaf_size") && cin->trySymbol("="))
  312. object_accel_mb_max_leaf_size = cin->get().Int();
  313. else if (tok == Token::Id("instancing_open_min") && cin->trySymbol("="))
  314. instancing_open_min = cin->get().Int();
  315. else if (tok == Token::Id("instancing_block_size") && cin->trySymbol("=")) {
  316. instancing_block_size = cin->get().Int();
  317. instancing_open_factor = 0.0f;
  318. }
  319. else if (tok == Token::Id("instancing_open_max_depth") && cin->trySymbol("="))
  320. instancing_open_max_depth = cin->get().Int();
  321. else if (tok == Token::Id("instancing_open_factor") && cin->trySymbol("=")) {
  322. instancing_block_size = 0;
  323. instancing_open_factor = cin->get().Float();
  324. }
  325. else if (tok == Token::Id("instancing_open_max") && cin->trySymbol("="))
  326. instancing_open_max = cin->get().Int();
  327. else if (tok == Token::Id("subdiv_accel") && cin->trySymbol("="))
  328. subdiv_accel = cin->get().Identifier();
  329. else if (tok == Token::Id("subdiv_accel_mb") && cin->trySymbol("="))
  330. subdiv_accel_mb = cin->get().Identifier();
  331. else if (tok == Token::Id("grid_accel") && cin->trySymbol("="))
  332. grid_accel = cin->get().Identifier();
  333. else if (tok == Token::Id("grid_accel_mb") && cin->trySymbol("="))
  334. grid_accel_mb = cin->get().Identifier();
  335. else if (tok == Token::Id("verbose") && cin->trySymbol("="))
  336. verbose = cin->get().Int();
  337. else if (tok == Token::Id("benchmark") && cin->trySymbol("="))
  338. benchmark = cin->get().Int();
  339. else if (tok == Token::Id("quality")) {
  340. if (cin->trySymbol("=")) {
  341. Token flag = cin->get();
  342. if (flag == Token::Id("low")) quality_flags = RTC_BUILD_QUALITY_LOW;
  343. else if (flag == Token::Id("medium")) quality_flags = RTC_BUILD_QUALITY_MEDIUM;
  344. else if (flag == Token::Id("high")) quality_flags = RTC_BUILD_QUALITY_HIGH;
  345. }
  346. }
  347. else if (tok == Token::Id("scene_flags")) {
  348. scene_flags = 0;
  349. if (cin->trySymbol("=")) {
  350. do {
  351. Token flag = cin->get();
  352. if (flag == Token::Id("dynamic") ) scene_flags |= RTC_SCENE_FLAG_DYNAMIC;
  353. else if (flag == Token::Id("compact")) scene_flags |= RTC_SCENE_FLAG_COMPACT;
  354. else if (flag == Token::Id("robust")) scene_flags |= RTC_SCENE_FLAG_ROBUST;
  355. } while (cin->trySymbol("|"));
  356. }
  357. }
  358. else if (tok == Token::Id("max_spatial_split_replications") && cin->trySymbol("="))
  359. max_spatial_split_replications = cin->get().Float();
  360. else if (tok == Token::Id("max_triangles_per_leaf") && cin->trySymbol("="))
  361. max_triangles_per_leaf = cin->get().Float();
  362. else if (tok == Token::Id("presplits") && cin->trySymbol("="))
  363. useSpatialPreSplits = cin->get().Int() != 0 ? true : false;
  364. else if (tok == Token::Id("tessellation_cache_size") && cin->trySymbol("="))
  365. tessellation_cache_size = size_t(cin->get().Float()*1024.0f*1024.0f);
  366. else if (tok == Token::Id("cache_size") && cin->trySymbol("="))
  367. tessellation_cache_size = size_t(cin->get().Float()*1024.0f*1024.0f);
  368. else if (tok == Token::Id("alloc_main_block_size") && cin->trySymbol("="))
  369. alloc_main_block_size = cin->get().Int();
  370. else if (tok == Token::Id("alloc_num_main_slots") && cin->trySymbol("="))
  371. alloc_num_main_slots = cin->get().Int();
  372. else if (tok == Token::Id("alloc_thread_block_size") && cin->trySymbol("="))
  373. alloc_thread_block_size = cin->get().Int();
  374. else if (tok == Token::Id("alloc_single_thread_alloc") && cin->trySymbol("="))
  375. alloc_single_thread_alloc = cin->get().Int();
  376. cin->trySymbol(","); // optional , separator
  377. }
  378. }
  379. bool State::verbosity(size_t N) {
  380. return N <= verbose;
  381. }
  382. void State::print()
  383. {
  384. std::cout << "general:" << std::endl;
  385. std::cout << " build threads = " << numThreads << std::endl;
  386. std::cout << " build user threads = " << numUserThreads << std::endl;
  387. std::cout << " start_threads = " << start_threads << std::endl;
  388. std::cout << " affinity = " << set_affinity << std::endl;
  389. std::cout << " frequency_level = ";
  390. switch (frequency_level) {
  391. case FREQUENCY_SIMD128: std::cout << "simd128" << std::endl; break;
  392. case FREQUENCY_SIMD256: std::cout << "simd256" << std::endl; break;
  393. case FREQUENCY_SIMD512: std::cout << "simd512" << std::endl; break;
  394. default: std::cout << "error" << std::endl; break;
  395. }
  396. std::cout << " hugepages = ";
  397. if (!hugepages) std::cout << "disabled" << std::endl;
  398. else if (hugepages_success) std::cout << "enabled" << std::endl;
  399. else std::cout << "failed" << std::endl;
  400. std::cout << " verbosity = " << verbose << std::endl;
  401. std::cout << " cache_size = " << float(tessellation_cache_size)*1E-6 << " MB" << std::endl;
  402. std::cout << " max_spatial_split_replications = " << max_spatial_split_replications << std::endl;
  403. std::cout << "triangles:" << std::endl;
  404. std::cout << " accel = " << tri_accel << std::endl;
  405. std::cout << " builder = " << tri_builder << std::endl;
  406. std::cout << " traverser = " << tri_traverser << std::endl;
  407. std::cout << "motion blur triangles:" << std::endl;
  408. std::cout << " accel = " << tri_accel_mb << std::endl;
  409. std::cout << " builder = " << tri_builder_mb << std::endl;
  410. std::cout << " traverser = " << tri_traverser_mb << std::endl;
  411. std::cout << "quads:" << std::endl;
  412. std::cout << " accel = " << quad_accel << std::endl;
  413. std::cout << " builder = " << quad_builder << std::endl;
  414. std::cout << " traverser = " << quad_traverser << std::endl;
  415. std::cout << "motion blur quads:" << std::endl;
  416. std::cout << " accel = " << quad_accel_mb << std::endl;
  417. std::cout << " builder = " << quad_builder_mb << std::endl;
  418. std::cout << " traverser = " << quad_traverser_mb << std::endl;
  419. std::cout << "line segments:" << std::endl;
  420. std::cout << " accel = " << line_accel << std::endl;
  421. std::cout << " builder = " << line_builder << std::endl;
  422. std::cout << " traverser = " << line_traverser << std::endl;
  423. std::cout << "motion blur line segments:" << std::endl;
  424. std::cout << " accel = " << line_accel_mb << std::endl;
  425. std::cout << " builder = " << line_builder_mb << std::endl;
  426. std::cout << " traverser = " << line_traverser_mb << std::endl;
  427. std::cout << "hair:" << std::endl;
  428. std::cout << " accel = " << hair_accel << std::endl;
  429. std::cout << " builder = " << hair_builder << std::endl;
  430. std::cout << " traverser = " << hair_traverser << std::endl;
  431. std::cout << "motion blur hair:" << std::endl;
  432. std::cout << " accel = " << hair_accel_mb << std::endl;
  433. std::cout << " builder = " << hair_builder_mb << std::endl;
  434. std::cout << " traverser = " << hair_traverser_mb << std::endl;
  435. std::cout << "subdivision surfaces:" << std::endl;
  436. std::cout << " accel = " << subdiv_accel << std::endl;
  437. std::cout << "grids:" << std::endl;
  438. std::cout << " accel = " << grid_accel << std::endl;
  439. std::cout << " builder = " << grid_builder << std::endl;
  440. std::cout << "motion blur grids:" << std::endl;
  441. std::cout << " accel = " << grid_accel_mb << std::endl;
  442. std::cout << " builder = " << grid_builder_mb << std::endl;
  443. std::cout << "object_accel:" << std::endl;
  444. std::cout << " min_leaf_size = " << object_accel_min_leaf_size << std::endl;
  445. std::cout << " max_leaf_size = " << object_accel_max_leaf_size << std::endl;
  446. std::cout << "object_accel_mb:" << std::endl;
  447. std::cout << " min_leaf_size = " << object_accel_mb_min_leaf_size << std::endl;
  448. std::cout << " max_leaf_size = " << object_accel_mb_max_leaf_size << std::endl;
  449. }
  450. }