| /************************************************************ |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| #ifndef SINGA_UTILS_OPENCL_UTILS_H_ |
| #define SINGA_UTILS_OPENCL_UTILS_H_ |
| |
| #ifdef USE_OPENCL |
| |
| #include <iostream> |
| |
| // http://github.khronos.org/OpenCL-CLHPP/ |
| // cl2.hpp includes cl.h, do not re-include. |
| #define CL_HPP_MINIMUM_OPENCL_VERSION 120 |
| #define CL_HPP_TARGET_OPENCL_VERSION 120 |
| #include <CL/cl2.hpp> |
| |
| #define CL_BREAK_ON_FAILURE if (status != CL_SUCCESS) return; |
| |
| |
| inline const char* clGetBuildInfoString(const cl_build_status status) { |
| switch (status) { |
| case CL_BUILD_NONE: return "CL_BUILD_NONE"; |
| case CL_BUILD_ERROR: return "CL_BUILD_ERROR"; |
| case CL_BUILD_SUCCESS: return "CL_BUILD_SUCCESS"; |
| case CL_BUILD_IN_PROGRESS: return "CL_BUILD_IN_PROGRESS"; |
| default: return ""; |
| } |
| } |
| |
| |
| inline const char* clGetErrorString(const cl_int status) { |
| |
| switch(status) { |
| |
| // Run-time and JIT compiler errors |
| case 0: return "CL_SUCCESS"; |
| case -1: return "CL_DEVICE_NOT_FOUND"; |
| case -2: return "CL_DEVICE_NOT_AVAILABLE"; |
| case -3: return "CL_COMPILER_NOT_AVAILABLE"; |
| case -4: return "CL_MEM_OBJECT_ALLOCATION_FAILURE"; |
| case -5: return "CL_OUT_OF_RESOURCES"; |
| case -6: return "CL_OUT_OF_HOST_MEMORY"; |
| case -7: return "CL_PROFILING_INFO_NOT_AVAILABLE"; |
| case -8: return "CL_MEM_COPY_OVERLAP"; |
| case -9: return "CL_IMAGE_FORMAT_MISMATCH"; |
| case -10: return "CL_IMAGE_FORMAT_NOT_SUPPORTED"; |
| case -11: return "CL_BUILD_PROGRAM_FAILURE"; |
| case -12: return "CL_MAP_FAILURE"; |
| case -13: return "CL_MISALIGNED_SUB_BUFFER_OFFSET"; |
| case -14: return "CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"; |
| case -15: return "CL_COMPILE_PROGRAM_FAILURE"; |
| case -16: return "CL_LINKER_NOT_AVAILABLE"; |
| case -17: return "CL_LINK_PROGRAM_FAILURE"; |
| case -18: return "CL_DEVICE_PARTITION_FAILED"; |
| case -19: return "CL_KERNEL_ARG_INFO_NOT_AVAILABLE"; |
| |
| // Compile-time errors |
| case -30: return "CL_INVALID_VALUE"; |
| case -31: return "CL_INVALID_DEVICE_TYPE"; |
| case -32: return "CL_INVALID_PLATFORM"; |
| case -33: return "CL_INVALID_DEVICE"; |
| case -34: return "CL_INVALID_CONTEXT"; |
| case -35: return "CL_INVALID_QUEUE_PROPERTIES"; |
| case -36: return "CL_INVALID_COMMAND_QUEUE"; |
| case -37: return "CL_INVALID_HOST_PTR"; |
| case -38: return "CL_INVALID_MEM_OBJECT"; |
| case -39: return "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"; |
| case -40: return "CL_INVALID_IMAGE_SIZE"; |
| case -41: return "CL_INVALID_SAMPLER"; |
| case -42: return "CL_INVALID_BINARY"; |
| case -43: return "CL_INVALID_BUILD_OPTIONS"; |
| case -44: return "CL_INVALID_PROGRAM"; |
| case -45: return "CL_INVALID_PROGRAM_EXECUTABLE"; |
| case -46: return "CL_INVALID_KERNEL_NAME"; |
| case -47: return "CL_INVALID_KERNEL_DEFINITION"; |
| case -48: return "CL_INVALID_KERNEL"; |
| case -49: return "CL_INVALID_ARG_INDEX"; |
| case -50: return "CL_INVALID_ARG_VALUE"; |
| case -51: return "CL_INVALID_ARG_SIZE"; |
| case -52: return "CL_INVALID_KERNEL_ARGS"; |
| case -53: return "CL_INVALID_WORK_DIMENSION"; |
| case -54: return "CL_INVALID_WORK_GROUP_SIZE"; |
| case -55: return "CL_INVALID_WORK_ITEM_SIZE"; |
| case -56: return "CL_INVALID_GLOBAL_OFFSET"; |
| case -57: return "CL_INVALID_EVENT_WAIT_LIST"; |
| case -58: return "CL_INVALID_EVENT"; |
| case -59: return "CL_INVALID_OPERATION"; |
| case -60: return "CL_INVALID_GL_OBJECT"; |
| case -61: return "CL_INVALID_BUFFER_SIZE"; |
| case -62: return "CL_INVALID_MIP_LEVEL"; |
| case -63: return "CL_INVALID_GLOBAL_WORK_SIZE"; |
| case -64: return "CL_INVALID_PROPERTY"; |
| case -65: return "CL_INVALID_IMAGE_DESCRIPTOR"; |
| case -66: return "CL_INVALID_COMPILER_OPTIONS"; |
| case -67: return "CL_INVALID_LINKER_OPTIONS"; |
| case -68: return "CL_INVALID_DEVICE_PARTITION_COUNT"; |
| |
| // Extension errors |
| case -1000: return "CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR"; |
| case -1001: return "CL_PLATFORM_NOT_FOUND_KHR"; |
| case -1002: return "CL_INVALID_D3D10_DEVICE_KHR"; |
| case -1003: return "CL_INVALID_D3D10_RESOURCE_KHR"; |
| case -1004: return "CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR"; |
| case -1005: return "CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR"; |
| |
| default: return "Unknown OpenCL status"; |
| } |
| } |
| |
| |
| /// Special function used to perform error checking and logging. |
| inline bool OCL_CHECK(const cl_int status, const char* what) { |
| if (status == CL_SUCCESS) return true; // Nothing wrong. |
| LOG(ERROR) << status << ": " << clGetErrorString(status) << " " << what << std::endl; |
| return false; |
| } |
| |
| /// Prints information about the specified Platform. |
| void PrintPlatformInfo(const cl::Platform &p); |
| |
| /// Prints information about the specified Device. |
| void PrintDeviceInfo(const cl::Device &dev); |
| |
| #endif // USE_OPENCL |
| |
| #endif // SINGA_UTILS_OPENCL_UTILS_H_ |