32 #ifndef VSMC_OPENCL_CL_QUERY_HPP
33 #define VSMC_OPENCL_CL_QUERY_HPP
69 dev.getInfo(CL_DEVICE_VERSION, &version);
71 return check_opencl_version(version.substr(7, 3));
80 dev.getInfo(CL_DEVICE_OPENCL_C_VERSION, &version);
82 return check_opencl_version(version.substr(9, 3));
86 template <OpenCLDeviceFeature feat>
89 return check_feature(dev,
94 template < ::cl_device_type DevType>
97 std::vector< ::cl::Device> device;
98 plat.getDevices(CL_DEVICE_TYPE_ALL, &device);
99 for (std::size_t i = 0; i != device.size(); ++i) {
100 ::cl_device_type
type;
101 device[i].getInfo(CL_DEVICE_TYPE, &type);
102 if ((type & DevType) != 0)
110 template < ::cl_device_type DevType>
113 std::vector< ::cl::Platform> platform;
115 for (std::size_t i = 0; i != platform.size(); ++i)
116 if (has_device<DevType>(platform[i]))
124 const ::cl::Program &program)
127 program.getInfo(CL_PROGRAM_NUM_DEVICES, &num);
129 std::vector<std::size_t> bin_size(num);
130 program.getInfo(CL_PROGRAM_BINARY_SIZES, &bin_size);
132 std::vector<std::vector<char> > bin_vec(num);
133 std::vector<char *> bin_ptr(num);
134 for (std::size_t i = 0; i != bin_vec.size(); ++i) {
135 bin_vec[i].resize(bin_size[i]);
136 bin_ptr[i] = &bin_vec[i][0];
138 program.getInfo(CL_PROGRAM_BINARIES, &bin_ptr);
140 std::vector<std::string> bin(num);
141 for (std::size_t i = 0; i != bin_vec.size(); ++i)
142 bin[i] = std::string(bin_vec[i].begin(), bin_vec[i].end());
149 const ::cl::Program program)
152 program.getInfo(CL_PROGRAM_NUM_DEVICES, &num);
154 std::vector< ::cl::Device> devices(num);
155 program.getInfo(CL_PROGRAM_DEVICES, &devices);
164 program.getInfo(CL_PROGRAM_SOURCE, &src);
170 static std::vector<std::pair< ::cl_build_status, std::string> >
174 ::cl_build_status status = CL_BUILD_SUCCESS;
176 std::vector<std::pair< ::cl_build_status, std::string> > build_log;
177 for (std::size_t i = 0; i != devices.size(); ++i) {
178 program.getBuildInfo(devices[i], CL_PROGRAM_BUILD_STATUS, &status);
179 program.getBuildInfo(devices[i], CL_PROGRAM_BUILD_LOG, &log);
180 build_log.push_back(std::make_pair(status, log));
187 template <
typename CharT,
typename Traits>
188 static std::vector<std::pair< ::cl_build_status, std::string> >
190 std::basic_ostream<CharT, Traits> &os)
192 std::string line(78,
'=');
197 std::vector<std::pair< ::cl_build_status, std::string> > build_log(
199 for (std::size_t i = 0; i != build_log.size(); ++i) {
200 devices[i].getInfo(CL_DEVICE_NAME, &dname);
201 if (build_log[i].first == CL_BUILD_SUCCESS)
202 os << line <<
"Build successed for : " << dname << std::endl;
204 os << line <<
"Build failed for : " << dname << std::endl;
205 os << line << build_log[i].second <<
'\n' << line << std::endl;
212 template <
typename CharT,
typename Traits>
213 static std::basic_ostream<CharT, Traits> &
info (
214 std::basic_ostream<CharT, Traits> &os)
219 std::vector< ::cl::Platform> platform;
221 for (std::size_t i = 0; i != platform.size(); ++i)
222 info(os, platform[i]);
229 template <
typename CharT,
typename Traits>
230 static std::basic_ostream<CharT, Traits> &
info (
231 std::basic_ostream<CharT, Traits> &os, const ::cl::Platform &plat)
238 print_info_val<std::string, ::cl_platform_info>(os, plat,
239 CL_PLATFORM_NAME,
"CL_PLATFORM_NAME");
240 print_info_val<std::string, ::cl_platform_info>(os, plat,
241 CL_PLATFORM_VENDOR,
"CL_PLATFORM_VENDOR");
242 print_info_val<std::string, ::cl_platform_info>(os, plat,
243 CL_PLATFORM_VERSION,
"CL_PLATFORM_VERSION");
244 print_info_val<std::string, ::cl_platform_info>(os, plat,
245 CL_PLATFORM_PROFILE,
"CL_PLATFORM_PROFILE");
246 print_plat_extensions(os, plat);
248 std::vector< ::cl::Device> device;
249 plat.getDevices(CL_DEVICE_TYPE_ALL, &device);
250 for (std::size_t i = 0; i != device.size(); ++i)
257 template <
typename CharT,
typename Traits>
258 static std::basic_ostream<CharT, Traits> &
info (
259 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
265 print_dev_version(os, dev);
267 print_dev_extensions(os, dev);
269 print_dev_processor(os, dev);
271 print_dev_memory(os, dev);
273 print_dev_vector(os, dev);
274 #if VSMC_OPENCL_VERSION >= 120
276 print_dev_single_fp_config(os, dev);
278 print_dev_double_fp_config(os, dev);
281 print_info_val<std::string, ::cl_device_info>(os, dev,
282 CL_DEVICE_BUILT_IN_KERNELS,
283 "CL_DEVICE_BUILT_IN_KERNELS");
285 print_dev_image_support(os, dev);
287 #endif // VSMC_OPENCL_VERSION >= 120
293 template <
typename CharT,
typename Traits>
294 static std::basic_ostream<CharT, Traits> &
info (
295 std::basic_ostream<CharT, Traits> &os, const ::cl::Context &ctx)
300 std::vector< ::cl::Device> device;
301 ctx.getInfo(CL_CONTEXT_DEVICES, &device);
302 for (std::size_t i = 0; i != device.size(); ++i)
309 template <
typename CharT,
typename Traits>
310 static std::basic_ostream<CharT, Traits> &
info (
311 std::basic_ostream<CharT, Traits> &os, const ::cl::Program &prog)
316 print_info_val< ::cl_uint, ::cl_program_info>(os, prog,
317 CL_PROGRAM_NUM_DEVICES,
"CL_PROGRAM_NUM_DEVICES");
318 print_info_val<std::size_t, ::cl_program_info>(os, prog,
319 CL_PROGRAM_BINARY_SIZES,
"CL_PROGRAM_BINARY_SIZES",
"byte");
325 template <
typename CharT,
typename Traits>
326 static std::basic_ostream<CharT, Traits> &
info (
327 std::basic_ostream<CharT, Traits> &os, const ::cl::Kernel &kern)
333 kern.getInfo(CL_KERNEL_CONTEXT, &ctx);
334 std::vector< ::cl::Device> device;
335 ctx.getInfo(CL_CONTEXT_DEVICES, &device);
336 for (std::size_t i = 0; i != device.size(); ++i) {
337 print_info_val<std::string, ::cl_device_info>(os, device[i],
340 print_info_val<std::string, ::cl_kernel_info>(os, kern,
341 CL_KERNEL_FUNCTION_NAME,
342 "CL_KERNEL_FUNCTION_NAME");
343 print_info_val< ::cl_uint, ::cl_kernel_info>(os, kern,
345 "CL_KERNEL_NUM_ARGS");
346 print_kernwginfo_val<std::size_t>(os, kern, device[i],
347 CL_KERNEL_WORK_GROUP_SIZE,
348 "CL_KERNEL_WORK_GROUP_SIZE");
349 print_kernwginfo_val<std::size_t>(os, kern, device[i],
350 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE,
351 "CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE");
352 print_kernwginfo_val< ::cl_ulong>(os, kern, device[i],
353 CL_KERNEL_LOCAL_MEM_SIZE,
354 "CL_KERNEL_LOCAL_MEM_SIZE",
"byte");
355 print_kernwginfo_val< ::cl_ulong>(os, kern, device[i],
356 CL_KERNEL_PRIVATE_MEM_SIZE,
357 "CL_KERNEL_PRIVATE_MEM_SIZE",
"byte");
365 template <
typename CharT,
typename Traits>
366 static std::basic_ostream<CharT, Traits> &
info (
367 std::basic_ostream<CharT, Traits> &os,
368 const ::cl::Program &prog,
const std::string &kname)
373 ::cl::Kernel kern(prog, kname.c_str());
381 static int check_opencl_version (
const std::string &version)
383 #if VSMC_OPENCL_VERSION >= 200
384 if (version == std::string(
"2.0"))
387 #if VSMC_OPENCL_VERSION >= 120
388 if (version == std::string(
"1.2"))
391 #if VSMC_OPENCL_VERSION >= 110
392 if (version == std::string(
"1.1"))
398 static bool check_feature (const ::cl::Device &dev,
403 dev.getInfo(CL_DEVICE_EXTENSIONS, &info);
404 if (info.find(
"cl_khr_fp64") != std::string::npos)
406 #if VSMC_OPENCL_VERSION >= 120
407 ::cl_device_fp_config config;
408 dev.getInfo(CL_DEVICE_DOUBLE_FP_CONFIG, &config);
415 static bool check_feature (const ::cl::Device &dev,
419 #if VSMC_OPENCL_VERSION >= 120
421 dev.getInfo(CL_DEVICE_IMAGE_SUPPORT, &support);
428 template <
typename CharT,
typename Traits>
429 static void print_equal (std::basic_ostream<CharT, Traits> &os)
430 {os << std::string(90,
'=') <<
'\n';}
432 template <
typename CharT,
typename Traits>
433 static void print_dash (std::basic_ostream<CharT, Traits> &os)
434 {os << std::string(90,
'-') <<
'\n';}
436 template <
typename CharT,
typename Traits>
437 static void print_plat_extensions (
438 std::basic_ostream<CharT, Traits> &os, const ::cl::Platform &plat)
441 plat.getInfo(CL_PLATFORM_EXTENSIONS, &info);
442 print_name(os,
"CL_PLATFORM_EXTENSIONS");
443 print_val(os, split_string(info));
447 template <
typename CharT,
typename Traits>
448 static void print_dev_version (
449 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
451 print_info_val<std::string, ::cl_device_info>(os, dev,
452 CL_DEVICE_NAME,
"CL_DEVICE_NAME");
453 print_dev_type(os, dev);
454 print_info_val<std::string, ::cl_device_info>(os, dev,
455 CL_DEVICE_VENDOR,
"CL_DEVICE_VENDOR");
456 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
457 CL_DEVICE_VENDOR_ID,
"CL_DEVICE_VENDOR_ID");
458 print_info_val<std::string, ::cl_device_info>(os, dev,
459 CL_DRIVER_VERSION,
"CL_DRIVER_VERSION");
460 print_info_val<std::string, ::cl_device_info>(os, dev,
461 CL_DEVICE_PROFILE,
"CL_DEVICE_PROFILE");
462 print_info_val<std::string, ::cl_device_info>(os, dev,
463 CL_DEVICE_VERSION,
"CL_DEVICE_VERSION");
464 print_info_val<std::string, ::cl_device_info>(os, dev,
465 CL_DEVICE_OPENCL_C_VERSION,
"CL_DEVICE_OPENCL_C_VERSION");
468 template <
typename CharT,
typename Traits>
469 static void print_dev_extensions (
470 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
473 dev.getInfo(CL_DEVICE_EXTENSIONS, &info);
474 print_name(os,
"CL_DEVICE_EXTENSIONS");
475 print_val(os, split_string(info));
479 template <
typename CharT,
typename Traits>
480 static void print_dev_type (
481 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
483 ::cl_device_type
type;
484 std::vector<std::string>
info;
485 dev.getInfo(CL_DEVICE_TYPE, &type);
487 append_bit_field< ::cl_device_type>(CL_DEVICE_TYPE_CPU,
488 type,
"CL_DEVICE_TYPE_CPU",
info);
489 append_bit_field< ::cl_device_type>(CL_DEVICE_TYPE_GPU,
490 type,
"CL_DEVICE_TYPE_GPU",
info);
491 append_bit_field< ::cl_device_type>(CL_DEVICE_TYPE_ACCELERATOR,
492 type,
"CL_DEVICE_TYPE_ACCELERATOR",
info);
493 append_bit_field< ::cl_device_type>(CL_DEVICE_TYPE_DEFAULT,
494 type,
"CL_DEVICE_TYPE_DEFAULT",
info);
495 append_bit_field< ::cl_device_type>(CL_DEVICE_TYPE_CUSTOM,
496 type,
"CL_DEVICE_TYPE_CUSTOM",
info);
498 print_name(os,
"CL_DEVICE_TYPE");
503 template <
typename CharT,
typename Traits>
504 static void print_dev_processor (
505 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
507 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
508 CL_DEVICE_MAX_CLOCK_FREQUENCY,
509 "CL_DEVICE_MAX_CLOCK_FREQUENCY",
"MHz");
510 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
511 CL_DEVICE_MAX_COMPUTE_UNITS,
512 "CL_DEVICE_MAX_COMPUTE_UNITS");
513 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
514 CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS,
515 "CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS");
516 print_info_val<std::vector<std::size_t>, ::cl_device_info>(os, dev,
517 CL_DEVICE_MAX_WORK_ITEM_SIZES,
518 "CL_DEVICE_MAX_WORK_ITEM_SIZES");
519 print_info_val<std::size_t, ::cl_device_info>(os, dev,
520 CL_DEVICE_MAX_WORK_GROUP_SIZE,
521 "CL_DEVICE_MAX_WORK_GROUP_SIZE");
522 print_info_val<std::size_t, ::cl_device_info>(os, dev,
523 CL_DEVICE_PROFILING_TIMER_RESOLUTION,
524 "CL_DEVICE_PROFILING_TIMER_RESOLUTION",
"ns");
527 template <
typename CharT,
typename Traits>
528 static void print_dev_memory (
529 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
531 print_info_val<std::size_t, ::cl_device_info>(os, dev,
532 CL_DEVICE_MAX_PARAMETER_SIZE,
533 "CL_DEVICE_MAX_PARAMETER_SIZE",
"byte");
534 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
535 CL_DEVICE_ADDRESS_BITS,
536 "CL_DEVICE_ADDRESS_BITS",
"bit");
537 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
538 CL_DEVICE_MEM_BASE_ADDR_ALIGN,
539 "CL_DEVICE_MEM_BASE_ADDR_ALIGN",
"bit");
540 print_info_val< ::cl_ulong, ::cl_device_info>(os, dev,
541 CL_DEVICE_MAX_MEM_ALLOC_SIZE,
542 "CL_DEVICE_MAX_MEM_ALLOC_SIZE",
"byte");
543 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
544 CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE,
545 "CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE",
"byte");
546 print_info_val< ::cl_ulong, ::cl_device_info>(os, dev,
547 CL_DEVICE_GLOBAL_MEM_CACHE_SIZE,
548 "CL_DEVICE_GLOBAL_MEM_CACHE_SIZE",
"byte");
549 print_info_val< ::cl_ulong, ::cl_device_info>(os, dev,
550 CL_DEVICE_GLOBAL_MEM_SIZE,
551 "CL_DEVICE_GLOBAL_MEM_SIZE",
"byte");
552 print_info_val< ::cl_ulong, ::cl_device_info>(os, dev,
553 CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,
554 "CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE",
"byte");
555 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
556 CL_DEVICE_MAX_CONSTANT_ARGS,
557 "CL_DEVICE_MAX_CONSTANT_ARGS");
558 print_info_val< ::cl_ulong, ::cl_device_info>(os, dev,
559 CL_DEVICE_LOCAL_MEM_SIZE,
560 "CL_DEVICE_LOCAL_MEM_SIZE",
"byte");
561 print_info_val< ::cl_bool, ::cl_device_info>(os, dev,
562 CL_DEVICE_ERROR_CORRECTION_SUPPORT,
563 "CL_DEVICE_ERROR_CORRECTION_SUPPORT");
566 template <
typename CharT,
typename Traits>
567 static void print_dev_vector (
568 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
570 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
571 CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR,
572 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR");
573 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
574 CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT,
575 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT");
576 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
577 CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT,
578 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT");
579 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
580 CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG,
581 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG");
582 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
583 CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT,
584 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT");
585 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
586 CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE,
587 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE");
588 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
589 CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF,
590 "CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF");
591 #if VSMC_OPENCL_VERSION >= 110
594 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
595 CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR,
596 "CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR");
597 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
598 CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT,
599 "CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT");
600 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
601 CL_DEVICE_NATIVE_VECTOR_WIDTH_INT,
602 "CL_DEVICE_NATIVE_VECTOR_WIDTH_INT");
603 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
604 CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG,
605 "CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG");
606 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
607 CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT,
608 "CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT");
609 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
610 CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE,
611 "CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE");
612 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
613 CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF,
614 "CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF");
616 #endif // VSMC_OPENCL_VERSION >= 110
619 #if VSMC_OPENCL_VERSION >= 120
620 template <
typename CharT,
typename Traits>
621 static void print_dev_single_fp_config (
622 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
624 ::cl_device_fp_config config;
625 std::vector<std::string>
info;
626 dev.getInfo(CL_DEVICE_SINGLE_FP_CONFIG, &config);
628 append_bit_field< ::cl_device_fp_config>(CL_FP_DENORM,
629 config,
"CL_FP_DENORM",
info);
630 append_bit_field< ::cl_device_fp_config>(CL_FP_INF_NAN,
631 config,
"CL_FP_INF_NAN",
info);
632 append_bit_field< ::cl_device_fp_config>(CL_FP_ROUND_TO_NEAREST,
633 config,
"CL_FP_ROUND_TO_NEAREST",
info);
634 append_bit_field< ::cl_device_fp_config>(CL_FP_ROUND_TO_ZERO,
635 config,
"CL_FP_ROUND_TO_ZERO",
info);
636 append_bit_field< ::cl_device_fp_config>(CL_FP_ROUND_TO_INF,
637 config,
"CL_FP_ROUND_TO_INF",
info);
638 append_bit_field< ::cl_device_fp_config>(CL_FP_FMA,
639 config,
"CL_FP_FMA",
info);
640 append_bit_field< ::cl_device_fp_config>(CL_FP_SOFT_FLOAT,
641 config,
"CL_FP_SOFT_FLOAT",
info);
642 append_bit_field< ::cl_device_fp_config>(
643 CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT,
644 config,
"CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT",
info);
646 print_name(os,
"CL_DEVICE_SINGLE_FP_CONFIG");
651 template <
typename CharT,
typename Traits>
652 static void print_dev_double_fp_config (
653 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
655 if (!has_feature<OpenCLDeviceDoubleFP>(dev))
658 ::cl_device_fp_config config;
659 std::vector<std::string>
info;
660 dev.getInfo(CL_DEVICE_DOUBLE_FP_CONFIG, &config);
662 append_bit_field< ::cl_device_fp_config>(CL_FP_DENORM,
663 config,
"CL_FP_DENORM",
info);
664 append_bit_field< ::cl_device_fp_config>(CL_FP_INF_NAN,
665 config,
"CL_FP_INF_NAN",
info);
666 append_bit_field< ::cl_device_fp_config>(CL_FP_ROUND_TO_NEAREST,
667 config,
"CL_FP_ROUND_TO_NEAREST",
info);
668 append_bit_field< ::cl_device_fp_config>(CL_FP_ROUND_TO_ZERO,
669 config,
"CL_FP_ROUND_TO_ZERO",
info);
670 append_bit_field< ::cl_device_fp_config>(CL_FP_ROUND_TO_INF,
671 config,
"CL_FP_ROUND_TO_INF",
info);
672 append_bit_field< ::cl_device_fp_config>(CL_FP_FMA,
673 config,
"CL_FP_FMA",
info);
674 append_bit_field< ::cl_device_fp_config>(CL_FP_SOFT_FLOAT,
675 config,
"CL_FP_SOFT_FLOAT",
info);
677 print_name(os,
"CL_DEVICE_DOUBLE_FP_CONFIG");
682 template <
typename CharT,
typename Traits>
683 static void print_dev_image_support (
684 std::basic_ostream<CharT, Traits> &os, const ::cl::Device &dev)
686 if (!has_feature<OpenCLDeviceImageSupport>(dev))
689 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
690 CL_DEVICE_MAX_READ_IMAGE_ARGS,
691 "CL_DEVICE_MAX_READ_IMAGE_ARGS");
692 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
693 CL_DEVICE_MAX_WRITE_IMAGE_ARGS,
694 "CL_DEVICE_MAX_WRITE_IMAGE_ARGS");
695 print_info_val<std::size_t, ::cl_device_info>(os, dev,
696 CL_DEVICE_IMAGE2D_MAX_WIDTH,
697 "CL_DEVICE_IMAGE2D_MAX_WIDTH",
"pixel");
698 print_info_val<std::size_t, ::cl_device_info>(os, dev,
699 CL_DEVICE_IMAGE2D_MAX_HEIGHT,
700 "CL_DEVICE_IMAGE2D_MAX_HEIGHT",
"pixel");
701 print_info_val<std::size_t, ::cl_device_info>(os, dev,
702 CL_DEVICE_IMAGE3D_MAX_WIDTH,
703 "CL_DEVICE_IMAGE3D_MAX_WIDTH",
"pixel");
704 print_info_val<std::size_t, ::cl_device_info>(os, dev,
705 CL_DEVICE_IMAGE3D_MAX_HEIGHT,
706 "CL_DEVICE_IMAGE3D_MAX_HEIGHT",
"pixel");
707 print_info_val<std::size_t, ::cl_device_info>(os, dev,
708 CL_DEVICE_IMAGE3D_MAX_DEPTH,
709 "CL_DEVICE_IMAGE3D_MAX_DEPTH",
"pixel");
710 print_info_val<std::size_t, ::cl_device_info>(os, dev,
711 CL_DEVICE_IMAGE_MAX_BUFFER_SIZE,
712 "CL_DEVICE_IMAGE_MAX_BUFFER_SIZE",
"pixel");
713 print_info_val<std::size_t, ::cl_device_info>(os, dev,
714 CL_DEVICE_IMAGE_MAX_ARRAY_SIZE,
715 "CL_DEVICE_IMAGE_MAX_ARRAY_SIZE");
716 print_info_val< ::cl_uint, ::cl_device_info>(os, dev,
717 CL_DEVICE_MAX_SAMPLERS,
718 "CL_DEVICE_MAX_SAMPLERS");
720 #endif // VSMC_OPENCL_VERSION >= 120
722 template <
typename T>
723 static void append_bit_field (T info, T val,
724 const std::string &name, std::vector<std::string> &strvec)
725 {
if ((info & val) != 0) strvec.push_back(name);}
727 template <
typename T>
730 std::size_t B =
static_cast<std::size_t
>(val);
731 std::size_t K = 1024;
732 std::size_t M = 1024 * K;
733 std::size_t G = 1024 * M;
734 std::stringstream ss;
736 ss << (B % G == 0 ? B / G :
static_cast<double>(B) / G) <<
'G';
738 ss << (B % M == 0 ? B / M :
static_cast<double>(B) / M) <<
'M';
740 ss << (B % K == 0 ? B / K :
static_cast<double>(B) / K) <<
'K';
747 template <
typename T>
749 {
return std::string();}
751 static std::vector<std::string> split_string (
const std::string &str)
753 std::istringstream ss(str);
754 return std::vector<std::string>(
755 std::istream_iterator<std::string>(ss),
756 std::istream_iterator<std::string>());
759 template <
typename T,
typename CLInfoType,
760 typename ObjType,
typename InfoType,
typename CharT,
typename Traits>
761 static void print_info_val (std::basic_ostream<CharT, Traits> &os,
762 const ObjType &obj, InfoType info,
763 const std::string &name,
const std::string &unit =
"")
766 obj.getInfo(static_cast<CLInfoType>(info), &val);
767 print_name(os, name);
768 if (cxx11::is_integral<T>::value && unit == std::string(
"byte"))
769 print_val(os, byte_string(val, cxx11::is_integral<T>()));
772 os <<
' ' << unit <<
'\n';
775 template <
typename T,
typename CharT,
typename Traits>
776 static void print_kernwginfo_val (std::basic_ostream<CharT, Traits> &os,
777 const ::cl::Kernel &kern, const ::cl::Device &dev,
778 cl_kernel_work_group_info info,
779 const std::string &name,
const std::string &unit =
"")
782 kern.getWorkGroupInfo(dev,
783 static_cast< ::cl_kernel_work_group_info>(info), &val);
784 print_name(os, name);
786 os <<
' ' << unit <<
'\n';
789 template <
typename CharT,
typename Traits>
790 static void print_name (
791 std::basic_ostream<CharT, Traits> &os,
const std::string &name)
793 if (name.size() <= 40) {
796 for (std::size_t i = 0; i != name.size(); ++i)
799 os << const_cast<const char *>(buffer) <<
' ';
805 template <
typename T,
typename CharT,
typename Traits>
806 static void print_val (std::basic_ostream<CharT, Traits> &os,
const T &val)
809 template <
typename T,
typename CharT,
typename Traits>
810 static void print_val (std::basic_ostream<CharT, Traits> &os,
811 const std::vector<T> &val)
813 for (std::size_t i = 0; i != val.size(); ++i)
817 template <
typename CharT,
typename Traits>
818 static void print_val (std::basic_ostream<CharT, Traits> &os,
819 const std::vector<std::string> &val)
824 if (val.size() == 1) {
829 os << val[0] <<
'\n';
830 for (std::size_t i = 1; i != val.size() - 1; ++i) {
831 os << std::string(41,
' ') << val[i] <<
'\n';
833 os << std::string(41,
' ') << val.back();
839 template <
typename CharT,
typename Traits>
841 std::basic_ostream<CharT, Traits> &os,
const CLQuery &)
850 template <
typename CharT,
typename Traits>
852 std::basic_ostream<CharT, Traits> &os,
const Platform &plat)
857 template <
typename CharT,
typename Traits>
859 std::basic_ostream<CharT, Traits> &os,
const Context &ctx)
864 template <
typename CharT,
typename Traits>
866 std::basic_ostream<CharT, Traits> &os,
const Device &dev)
871 template <
typename CharT,
typename Traits>
873 std::basic_ostream<CharT, Traits> &os,
const Program &prog)
878 template <
typename CharT,
typename Traits>
880 std::basic_ostream<CharT, Traits> &os,
const Kernel &kern)
885 #endif // VSMC_OPENCL_CL_QUERY_HPP
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os, const ::cl::Program &prog, const std::string &kname)
Query kernel information given a program the name of kernel and a program.
static std::vector< std::pair< ::cl_build_status, std::string > > program_build_log(const ::cl::Program &program)
Program build log and status.
Query OpenCL information.
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os, const ::cl::Kernel &kern)
Query kernel information.
integral_constant< bool, false > false_type
void * memset(void *dst, int ch, std::size_t n)
SIMD optimized memset with non-temporal store for large buffers.
static bool has_feature(const ::cl::Device &dev)
Check if a device feature exists.
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os, const ::cl::Platform &plat)
Query platform information.
T & get(Array< T, N > &ary)
Array ADL of get.
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os, const ::cl::Program &prog)
Query program informaiton.
static int opencl_c_version(const ::cl::Device &dev)
Return the OpenCL C version of a device.
static bool has_device()
Check if a device type exists in any platform.
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os)
Query all information.
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Sampler< T > &sampler)
static bool has_device(const ::cl::Platform &plat)
Check if a device type exists in a platform.
OpenCLDeviceFeature
OpenCL device features.
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Platform &plat)
Query device information in a given platform.
integral_constant< bool, true > true_type
static std::vector< std::pair< ::cl_build_status, std::string > > program_build_log(const ::cl::Program &program, std::basic_ostream< CharT, Traits > &os)
Print program build log and status.
static int opencl_version(const ::cl::Device &dev)
Return the OpenCL version of a device.
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os, const ::cl::Device &dev)
Query device information.
static std::basic_ostream< CharT, Traits > & info(std::basic_ostream< CharT, Traits > &os, const ::cl::Context &ctx)
Query context information.
static std::string program_source(const ::cl::Program &program)
Program source.
static std::vector< std::string > program_binary(const ::cl::Program &program)
Program binary vector.
static std::vector< ::cl::Device > program_device(const ::cl::Program program)
Program device vector.
Double precision floating points.