原文地址:Android AARCH64 平台的 OpenCL 配置

Android AARCH64 平台的 OpenCL 配置

开发环境

IDE: Android Studio 3.4.1

Android: 7.1

minSdkVersion: 25

targetSdkVersion: 26

JNI CMake: 3.4.1

ABI: arm64-v8a

OpenCL: 1.2

配置 OpenCL 使用项目中的 so 库

这里以编译 openclTest.cpp 为 libopenclTest.so 并导入 OpenCL 的动态库为例

注1: 下列 so 库需要从开发板上 pull 到项目中,其中 libGLES_mali.so 用于驱动 OpenCL,其他库为依赖库

注2: 不同平台的驱动库位于不同位置,可以下载 OpenCL-Z 查看

注3: set_target_properties 中第一项参数设置了生成库的名称,例如设置为 openclTest,则生成 libopenclTest.so 库,这里使用了 lib_* 作为前缀,则生成liblib_*.so 库,实际开发中要避免这种情况

查看依赖库

  1. objdump -x libGLES_mali.so | grep NEEDED

目录结构

  1. opencltest
  2. ├─ app
  3. ├─ build
  4. ├─ libs
  5. └─ src
  6. ├─ androidTest
  7. ├─ main
  8. ├─ java
  9. └─ com
  10. └─ example
  11. └─ opencltest
  12. MainActivity.java
  13. ├─ jni #C/C++ 源码目录
  14. └─ openclTest.cpp
  15. ├─ jniLibs #JNI 需要调用的运行库
  16. └─ arm64-v8a #对应 ABI 版本建立文件夹
  17. ├─ libbinder.so
  18. ├─ libc++.so
  19. ├─ libc.so
  20. ├─ libcrypto.so
  21. ├─ libcutils.so
  22. ├─ libdl.so
  23. ├─ libGLES_mali.so
  24. ├─ libhardware.so
  25. ├─ liblog.so
  26. ├─ libm.so
  27. ├─ libui.so
  28. ├─ libutils.so
  29. └─ libz.so
  30. └─ res
  31. └─ test
  32. └─ gradle

CMakeLists.txt 增加配置

  1. add_library(openclTest
  2. SHARED
  3. src/main/jni/openclTest.cpp )
  4. add_library(lib_opencl SHARED IMPORTED)
  5. set_target_properties(lib_opencl
  6. PROPERTIES
  7. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libGLES_mali.so )
  8. add_library(lib_z SHARED IMPORTED)
  9. set_target_properties(lib_z
  10. PROPERTIES
  11. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libz.so )
  12. add_library(lib_log SHARED IMPORTED)
  13. set_target_properties(lib_log
  14. PROPERTIES
  15. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/liblog.so )
  16. add_library(lib_utils SHARED IMPORTED)
  17. set_target_properties(lib_utils
  18. PROPERTIES
  19. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libutils.so )
  20. add_library(lib_ui SHARED IMPORTED)
  21. set_target_properties(lib_ui
  22. PROPERTIES
  23. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libui.so )
  24. add_library(lib_cutils SHARED IMPORTED)
  25. set_target_properties(lib_cutils
  26. PROPERTIES
  27. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcutils.so )
  28. add_library(lib_binder SHARED IMPORTED)
  29. set_target_properties(lib_binder
  30. PROPERTIES
  31. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libbinder.so )
  32. add_library(lib_crypto SHARED IMPORTED)
  33. set_target_properties(lib_crypto
  34. PROPERTIES
  35. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.so )
  36. add_library(lib_dl SHARED IMPORTED)
  37. set_target_properties(lib_dl
  38. PROPERTIES
  39. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libdl.so )
  40. add_library(lib_hardware SHARED IMPORTED)
  41. set_target_properties(lib_hardware
  42. PROPERTIES
  43. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libhardware.so )
  44. add_library(lib_c++ SHARED IMPORTED)
  45. set_target_properties(lib_c++
  46. PROPERTIES
  47. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libc++.so )
  48. add_library(lib_c SHARED IMPORTED)
  49. set_target_properties(lib_c
  50. PROPERTIES
  51. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libc.so )
  52. add_library(lib_m SHARED IMPORTED)
  53. set_target_properties(lib_m
  54. PROPERTIES
  55. IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libm.so )
  56. target_link_libraries(openclTest
  57. ${log-lib}
  58. lib_opencl )

配置 OpenCL 使用 dlopen 打开开发板上的运行库

这种配置方法需要从 Github - KhronosGroup/OpenCL-Headers 仓库下载 OpenCL 的头文件,并且需要自行实现 OpenCL 的函数

注: 需要在源码中定义 CL_TARGET_OPENCL_VERSION 120,否则会报找不到版本号的错误

目录结构

  1. opencltest
  2. ├─ app
  3. ├─ build
  4. ├─ libs
  5. └─ src
  6. ├─ androidTest
  7. ├─ main
  8. ├─ java
  9. └─ com
  10. └─ example
  11. └─ opencltest
  12. MainActivity.java
  13. ├─ jni #C/C++ 源码目录
  14. ├─ dlopencl.cpp #dlopen 打开运行库,实现 OpenCL 中的函数
  15. ├─ openclTest.cpp
  16. └─ include #JNI 调用的头文件
  17. ├─ dlopencl.h #定义 OpenCL 中的函数
  18. └─ CL #OpenCL 需要使用的头文件
  19. ├─ cl.h
  20. ├─ cl_ext.h
  21. ├─ cl_gl.h
  22. ├─ cl_gl_ext.h
  23. ├─ cl_platform.h
  24. ├─ cl_version.h
  25. └─ opencl.h
  26. └─ res
  27. └─ test
  28. └─ gradle

CMakeLists.txt 增加配置

  1. include_directories(${PROJECT_SOURCE_DIR}/src/main/jni/include)
  2. add_library(openclTest
  3. SHARED
  4. src/main/jni/openclTest.cpp )
  5. add_library(lib_dlopencl
  6. SHARED
  7. src/main/jni/dlopencl.cpp )
  8. target_link_libraries(openclTest
  9. ${log-lib}
  10. lib_dlopencl )

需要导入的 dlopencl.h 和 dlopencl.cpp 写在文末

OpenCL 使用

以下均以使用 dlopen 导入运行库的方式为例

  1. 定义 OpenCL 版本
  1. #define CL_TARGET_OPENCL_VERSION 120
  1. 包含头文件
  1. #include <CL/cl.h>
  2. #include "dlopencl.h"
  1. 使用 Logcat 打印日志

由于 C 语言工作在 JNI 层,无法获取控制台,导致了 printf() 函数失效,这里使用 __android_log_print 方法打印日志到 Logcat

  1. #include <android/log.h>
  2. #define DEBUG
  3. #ifdef DEBUG
  4. #define LOG "LOG-TAG"
  5. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG, __VA_ARGS__)
  6. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG, __VA_ARGS__)
  7. #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG, __VA_ARGS__)
  8. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG, __VA_ARGS__)
  9. #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, LOG, __VA_ARGS__)
  10. #else
  11. #define LOG
  12. #define LOGD(...)
  13. #define LOGI(...)
  14. #define LOGW(...)
  15. #define LOGE(...)
  16. #define LOGF(...)
  17. #endif

使用方法同 printf(),例:

  1. LOGI("Device ID: %d", device_id);
  1. 创建用于初始化 OpenCL 的 JNI 接口

建议在同一个文件中编写多个操作 OpenCL 的函数,这里的初始化实际上是将操作 OpenCL 的变量建立为全局变量,通过 JNI 一次调用后其他函数再使用这些被初始化过的变量

定义变量

  1. cl_uint num_device;
  2. cl_uint num_platform;
  3. cl_platform_id *platform;
  4. cl_device_id *devices;
  5. cl_int err;
  6. cl_context context;
  1. extern "C"
  2. JNIEXPORT jint JNICALL
  3. Java_com_example_opencltest_MainActivity_initOpencl(JNIEnv *env, jobject instance) {
  4. initFns();
  5. LOGI("getPlatformNum");
  6. // 获取可用平台数量
  7. err = clGetPlatformIDs(0, 0, &num_platform);
  8. platform = (cl_platform_id*)malloc(sizeof(cl_platform_id)*num_platform);
  9. LOGI("getPlatformIDs");
  10. // 获取平台 ID
  11. err = clGetPlatformIDs(num_platform, platform, nullptr);
  12. if(err < 0) {
  13. LOGE("clGetPlatformIDs failed");
  14. return -1;
  15. }
  16. LOGI("getDeviceNum");
  17. // 获取可用设备数量
  18. err = clGetDeviceIDs(platform[0], CL_DEVICE_TYPE_GPU, 0, nullptr, &num_device);
  19. devices = (cl_device_id*)malloc(sizeof(cl_device_id)*num_device);
  20. LOGI("getDeviceIDs");
  21. // 获取设备 ID
  22. err = clGetDeviceIDs(platform[0], CL_DEVICE_TYPE_GPU, num_device, devices, nullptr);
  23. if (err < 0) {
  24. LOGE("clGetDeviceIDs failed");
  25. return -1;
  26. }
  27. return 0;
  28. }

使用 OpenCL 执行 Kernel 函数

通常编写 OpenCL 中的 Kernel 函数要求单独写在 *.cl 文件中,调用时使用 fopen 打开,将里面的代码作为字符串读入之后再进行 runtime 编译,比较麻烦,这里直接将整个 Kernel 函数写成字符串

本例中因为测试原因没有释放掉创建的资源

可以使用允许正则替换的编辑器例如 VSCode,先写好 Kernel 函数,然后使用正则表达式 (.*) 选择所有行并将每一行作为一个参数($1),替换为 "$1\\n",例如替换前: int a = 0;,替换后: "int a = 0;\n"

注1: 经测试发现 OpenCL 在 PC 端允许每次调用任意数量的矢量数据,而在开发板上只允许一次调用 1.2.3.4.8.16 个

PC 端允许的矢量调用:

  1. Integralgraph.s0
  2. Integralgraph.s01
  3. Integralgraph.s012
  4. Integralgraph.s0123
  5. Integralgraph.s01234
  6. Integralgraph.s0123456
  7. Integralgraph.s01234567
  8. Integralgraph.s012345678
  9. Integralgraph.s0123456789
  10. Integralgraph.s0123456789a
  11. Integralgraph.s0123456789ab
  12. Integralgraph.s0123456789abc
  13. Integralgraph.s0123456789abcd
  14. Integralgraph.s0123456789abcde
  15. Integralgraph.s0123456789abcdef

开发板允许的矢量调用:

  1. Integralgraph.s0
  2. Integralgraph.s01
  3. Integralgraph.s012
  4. Integralgraph.s0123
  5. Integralgraph.s01234567
  6. Integralgraph.s0123456789abcdef

所以在编写运行于 AARCH64 架构的 OpenCL Kernel 函数时需要将被调用的矢量数组分组相加

例如在 PC 端为

  1. TableInteg1 = (int16)(Integralgraph[index1].sf*flagx0, Integralgraph[index4].s0123456789abcde);

在开发板中需要改为

  1. TableInteg1 = (int16)(Integralgraph[index1].sf*flagx0, Integralgraph[index4].s01234567, Integralgraph[index4].s89ab, Integralgraph[index4].scde);

注2: 测试中发现 PC 端的 OpenCL 遇到数组越界问题会直接跳过不予处理,但在 AARCH64 中会导致执行失败

注3: AARCH64 平台上 OpenCL 能申请到的可调用内存远小于 PC 端,如果出现输入或输出的数据超出 OpenCL 申请到的内存可能会导致数据输出不完整,读取数据时错误代码返回 -14 等问题

先在 Activity 中调用 initOpencl(),初始化 OpenCL 及其平台和设备

  1. // 定义积分图宽度
  2. #define CLL_IMAGE_W (400)
  3. // 定义积分图高度
  4. #define CLL_IMAGE_H (80)
  5. // 构建 Kernel 函数字符串
  6. const char *clkernel[] = {
  7. "__kernel void kernel_Integralgraph_45int(__global int16 * grayImage,\n"
  8. " __global int16 * Integralgraph,\n"
  9. " __global unsigned * const p_height) {\n"
  10. " int x = get_global_id(0);\n"
  11. " int height = *p_height;\n"
  12. " int width = get_global_size(0);\n"
  13. " __local int index, index1, index2, index3, index4, index5;\n"
  14. " __local bool flagx0, flagxw, flagy1, flagy2;\n"
  15. " __local int16 TableInteg1, TableInteg2, TableInteg3;\n"
  16. " flagx0 = min(0, -x);\n"
  17. " flagxw = min(0, x - width + 1);\n"
  18. " for (int j = 0; j < height; j++) {\n"
  19. " flagy1 = min(0, -j);\n"
  20. " flagy2 = min(0, 1 - j);\n"
  21. " index = j * width + x;\n"
  22. " if(j==0) {\n"
  23. " Integralgraph[index] = (int16)grayImage[index];\n"
  24. " } else if(j==1) {\n"
  25. " index1 = (j - 1)*width + x - 1;\n"
  26. " index3 = (j - 1)*width + x + 1;\n"
  27. " index4 = (j - 1)*width + x;\n"
  28. " TableInteg1 = (int16)(Integralgraph[index1].sf*flagx0, Integralgraph[index4].s01234567, Integralgraph[index4].s89ab, Integralgraph[index4].scde);\n"
  29. " TableInteg3 = (int16)(Integralgraph[index4].s12345678, Integralgraph[index4].s9abc, Integralgraph[index4].sdef, Integralgraph[index3].s0*flagxw);\n"
  30. " Integralgraph[index] = (int16)((int16)TableInteg1*flagy1 + (int16)TableInteg3*flagy1 + (int16)grayImage[index4] * flagy1 + (int16)grayImage[index]);\n"
  31. " } else {\n"
  32. " index1 = (j - 1)*width + x - 1;\n"
  33. " index2 = (j - 2)*width + x;\n"
  34. " index3 = (j - 1)*width + x + 1;\n"
  35. " index4 = (j - 1)*width + x;\n"
  36. " TableInteg1 = (int16)(Integralgraph[index1].sf*flagx0, Integralgraph[index4].s01234567, Integralgraph[index4].s89ab, Integralgraph[index4].scde);\n"
  37. " TableInteg2 = (int16)(Integralgraph[index2].s0*flagx0, Integralgraph[index2].s12345678, Integralgraph[index2].s9ab, Integralgraph[index2].scde, Integralgraph[index2].sf*flagxw);\n"
  38. " TableInteg3 = (int16)(Integralgraph[index4].s12345678, Integralgraph[index4].s9abc, Integralgraph[index4].sdef, Integralgraph[index3].s0*flagxw);\n"
  39. " Integralgraph[index] = (int16)((int16)TableInteg1*flagy1 + (int16)TableInteg3*flagy1 - (int16)TableInteg2 * flagy2 + (int16)grayImage[index4] * flagy1 + (int16)grayImage[index]);\n"
  40. " }\n"
  41. " }\n"
  42. "}\n"
  43. };
  44. // 创建 Context
  45. context = clCreateContext(nullptr, 1, devices, nullptr, nullptr, &err);
  46. if(err < 0) {
  47. LOGE("Create context failed, error code: [%d]", err);
  48. return -1;
  49. }
  50. int inputData[CLL_IMAGE_W * CLL_IMAGE_H];
  51. int outputData[CLL_IMAGE_W * CLL_IMAGE_H];
  52. int width = CLL_IMAGE_W;
  53. int height = CLL_IMAGE_H;
  54. // 初始化输入输出数据
  55. for (int i = 0; i < height; i++) {
  56. for (int j = 0; j < width; j++) {
  57. inputData[i * width + j] = 1;
  58. outputData[i * width + j] = 0;
  59. }
  60. }
  61. clock_t time_start;
  62. clock_t time_finish;
  63. double total_time;
  64. char *program_log;
  65. cl_command_queue queue;
  66. cl_kernel kernel;
  67. size_t log_size;
  68. cl_program program;
  69. // 创建命令队列
  70. queue = clCreateCommandQueue(context, devices[0], 0, &err);
  71. if (err < 0) {
  72. LOGE("Create command queue failed, error code: [%d]", err);
  73. }
  74. // 创建程序
  75. program = clCreateProgramWithSource(context, sizeof(clkernel) / sizeof(clkernel[0]), clkernel, nullptr, nullptr);
  76. // 构建/编译程序
  77. err = clBuildProgram(program, 0, nullptr, nullptr, nullptr, nullptr);
  78. if (err < 0) {
  79. clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, 0, nullptr, &log_size);
  80. program_log = (char*)malloc(sizeof(log_size));
  81. // 查询构建/编译过程中的 log
  82. clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, log_size, program_log, nullptr);
  83. LOGE("program_build_info: \n[%s]\n", program_log);
  84. free(program_log);
  85. }
  86. // 创建 Kernel
  87. kernel = clCreateKernel(program, "kernel_Integralgraph_45int", &err);
  88. if (err < 0) {
  89. LOGE("Create kernel failed, error code: [%d]", err);
  90. }
  91. // 创建用于输入参数、输出数据的内存空间
  92. cl_mem meminput_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * height * width, inputData, &err);
  93. cl_mem memoutput_buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(int) * height * width, nullptr, &err);
  94. cl_mem memHeight_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int), &height, &err);
  95. // 向 Kernel 传递参数
  96. err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &meminput_buffer);
  97. err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memoutput_buffer);
  98. err = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memHeight_buffer);
  99. size_t global_work_offset[2] = {0, 0};
  100. size_t localThreads[2] = {1, 1};
  101. size_t globalThreads[2] = {(size_t)(width / 16), 1};
  102. // 获得程序开始执行的时间戳
  103. time_start = clock();
  104. // 排布工作组与工作项并执行
  105. err = clEnqueueNDRangeKernel(queue, kernel, 2, global_work_offset, globalThreads, localThreads, 0, nullptr, nullptr);
  106. if (err < 0) {
  107. LOGE("Run Kernel failed, error code: [%d]", err);
  108. }
  109. // 获得程序执行完成的时间戳
  110. time_finish = clock();
  111. // 计算运行时间
  112. total_time = (double)(time_finish - time_start) / CLOCKS_PER_SEC;
  113. LOGI("Total time: [%f]s", total_time);
  114. // 从输出的内存空间中读取数据
  115. err = clEnqueueReadBuffer(queue, memoutput_buffer, CL_TRUE, 0, sizeof(int) * height * width, outputData, 0, nullptr, nullptr);
  116. if (err < 0) {
  117. LOGE("Read buffer failed, error code: [%d]", err);
  118. }
  119. // 输出数据,积分图中的每一行拼接为一条 LOG
  120. char outputDataTemp[2048];
  121. for (int i = 0; i < height ; i++) {
  122. // 清空字符串,拼接下一行
  123. memset(outputDataTemp, 0x00, 2048);
  124. for (int j = 0; j < width ; j++) {
  125. // 将一行数据拼接在一个字符串中
  126. sprintf(outputDataTemp, "%s %d", outputDataTemp, outputData[i * width + j]);
  127. }
  128. // LOG打印
  129. LOGI("line [%d]\n%s", i, outputDataTemp);
  130. }

附加

dlopencl.h

  1. #ifndef __AOPENCL_CL_H
  2. #define __AOPENCL_CL_H
  3. #ifdef __APPLE__
  4. #include <OpenCL/cl_platform.h>
  5. #else
  6. #include <CL/cl_platform.h>
  7. #endif
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #define IAH()
  12. //#define IAH() printf("File:%s, Line:%d\n",__FILE__, __LINE__);
  13. void initFns();
  14. /* Platform API */
  15. #define clGetPlatformIDs aclGetPlatformIDs
  16. cl_int
  17. (*aclGetPlatformIDs)(cl_uint /* num_entries */,
  18. cl_platform_id * /* platforms */,
  19. cl_uint * /* num_platforms */);
  20. #define clGetPlatformInfo aclGetPlatformInfo
  21. cl_int
  22. (*aclGetPlatformInfo)(cl_platform_id /* platform */,
  23. cl_platform_info /* param_name */,
  24. size_t /* param_value_size */,
  25. void * /* param_value */,
  26. size_t * /* param_value_size_ret */);
  27. /* Device APIs */
  28. #define clGetDeviceIDs aclGetDeviceIDs
  29. cl_int
  30. (*aclGetDeviceIDs)(cl_platform_id /* platform */,
  31. cl_device_type /* device_type */,
  32. cl_uint /* num_entries */,
  33. cl_device_id * /* devices */,
  34. cl_uint * /* num_devices */);
  35. #define clGetDeviceInfo aclGetDeviceInfo
  36. cl_int
  37. (*aclGetDeviceInfo)(cl_device_id /* device */,
  38. cl_device_info /* param_name */,
  39. size_t /* param_value_size */,
  40. void * /* param_value */,
  41. size_t * /* param_value_size_ret */);
  42. /* Context APIs */
  43. #define clCreateContext aclCreateContext
  44. cl_context
  45. (*aclCreateContext)(const cl_context_properties * /* properties */,
  46. cl_uint /* num_devices */,
  47. const cl_device_id * /* devices */,
  48. void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *),
  49. void * /* user_data */,
  50. cl_int * /* errcode_ret */);
  51. #define clCreateContextFromType aclCreateContextFromType
  52. cl_context
  53. (*aclCreateContextFromType)(const cl_context_properties * /* properties */,
  54. cl_device_type /* device_type */,
  55. void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *),
  56. void * /* user_data */,
  57. cl_int * /* errcode_ret */);
  58. #define clRetainContext aclRetainContext
  59. cl_int
  60. (*aclRetainContext)(cl_context /* context */);
  61. #define clReleaseContext aclReleaseContext
  62. cl_int
  63. (*aclReleaseContext)(cl_context /* context */);
  64. #define clGetContextInfo aclGetContextInfo
  65. cl_int
  66. (*aclGetContextInfo)(cl_context /* context */,
  67. cl_context_info /* param_name */,
  68. size_t /* param_value_size */,
  69. void * /* param_value */,
  70. size_t * /* param_value_size_ret */);
  71. /* Command Queue APIs */
  72. #define clCreateCommandQueue aclCreateCommandQueue
  73. cl_command_queue
  74. (*aclCreateCommandQueue)(cl_context /* context */,
  75. cl_device_id /* device */,
  76. cl_command_queue_properties /* properties */,
  77. cl_int * /* errcode_ret */);
  78. #define clRetainCommandQueue aclRetainCommandQueue
  79. cl_int
  80. (*aclRetainCommandQueue)(cl_command_queue /* command_queue */);
  81. #define clReleaseCommandQueue aclReleaseCommandQueue
  82. cl_int
  83. (*aclReleaseCommandQueue)(cl_command_queue /* command_queue */);
  84. #define clGetCommandQueueInfo aclGetCommandQueueInfo
  85. cl_int
  86. (*aclGetCommandQueueInfo)(cl_command_queue /* command_queue */,
  87. cl_command_queue_info /* param_name */,
  88. size_t /* param_value_size */,
  89. void * /* param_value */,
  90. size_t * /* param_value_size_ret */);
  91. /* Memory Object APIs */
  92. #define clCreateBuffer aclCreateBuffer
  93. cl_mem
  94. (*aclCreateBuffer)(cl_context /* context */,
  95. cl_mem_flags /* flags */,
  96. size_t /* size */,
  97. void * /* host_ptr */,
  98. cl_int * /* errcode_ret */);
  99. #define clCreateSubBuffer aclCreateSubBuffer
  100. cl_mem
  101. (*aclCreateSubBuffer)(cl_mem /* buffer */,
  102. cl_mem_flags /* flags */,
  103. cl_buffer_create_type /* buffer_create_type */,
  104. const void * /* buffer_create_info */,
  105. cl_int * /* errcode_ret */);
  106. #define clRetainMemObject aclRetainMemObject
  107. cl_int
  108. (*aclRetainMemObject)(cl_mem /* memobj */);
  109. #define clReleaseMemObject aclReleaseMemObject
  110. cl_int
  111. (*aclReleaseMemObject)(cl_mem /* memobj */);
  112. #define clGetSupportedImageFormats aclGetSupportedImageFormats
  113. cl_int
  114. (*aclGetSupportedImageFormats)(cl_context /* context */,
  115. cl_mem_flags /* flags */,
  116. cl_mem_object_type /* image_type */,
  117. cl_uint /* num_entries */,
  118. cl_image_format * /* image_formats */,
  119. cl_uint * /* num_image_formats */);
  120. #define clGetMemObjectInfo aclGetMemObjectInfo
  121. cl_int
  122. (*aclGetMemObjectInfo)(cl_mem /* memobj */,
  123. cl_mem_info /* param_name */,
  124. size_t /* param_value_size */,
  125. void * /* param_value */,
  126. size_t * /* param_value_size_ret */);
  127. #define clGetImageInfo aclGetImageInfo
  128. cl_int
  129. (*aclGetImageInfo)(cl_mem /* image */,
  130. cl_image_info /* param_name */,
  131. size_t /* param_value_size */,
  132. void * /* param_value */,
  133. size_t * /* param_value_size_ret */);
  134. #define clSetMemObjectDestructorCallback aclSetMemObjectDestructorCallback
  135. cl_int
  136. (*aclSetMemObjectDestructorCallback)( cl_mem /* memobj */,
  137. void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
  138. void * /*user_data */ );
  139. /* Sampler APIs */
  140. #define clCreateSampler aclCreateSampler
  141. cl_sampler
  142. (*aclCreateSampler)(cl_context /* context */,
  143. cl_bool /* normalized_coords */,
  144. cl_addressing_mode /* addressing_mode */,
  145. cl_filter_mode /* filter_mode */,
  146. cl_int * /* errcode_ret */);
  147. #define clRetainSampler aclRetainSampler
  148. cl_int
  149. (*aclRetainSampler)(cl_sampler /* sampler */);
  150. #define clReleaseSampler aclReleaseSampler
  151. cl_int
  152. (*aclReleaseSampler)(cl_sampler /* sampler */);
  153. #define clGetSamplerInfo aclGetSamplerInfo
  154. cl_int
  155. (*aclGetSamplerInfo)(cl_sampler /* sampler */,
  156. cl_sampler_info /* param_name */,
  157. size_t /* param_value_size */,
  158. void * /* param_value */,
  159. size_t * /* param_value_size_ret */);
  160. /* Program Object APIs */
  161. #define clCreateProgramWithSource aclCreateProgramWithSource
  162. cl_program
  163. (*aclCreateProgramWithSource)(cl_context /* context */,
  164. cl_uint /* count */,
  165. const char ** /* strings */,
  166. const size_t * /* lengths */,
  167. cl_int * /* errcode_ret */);
  168. #define clCreateProgramWithBinary aclCreateProgramWithBinary
  169. cl_program
  170. (*aclCreateProgramWithBinary)(cl_context /* context */,
  171. cl_uint /* num_devices */,
  172. const cl_device_id * /* device_list */,
  173. const size_t * /* lengths */,
  174. const unsigned char ** /* binaries */,
  175. cl_int * /* binary_status */,
  176. cl_int * /* errcode_ret */);
  177. #define clRetainProgram aclRetainProgram
  178. cl_int
  179. (*aclRetainProgram)(cl_program /* program */);
  180. #define clReleaseProgram aclReleaseProgram
  181. cl_int
  182. (*aclReleaseProgram)(cl_program /* program */);
  183. #define clBuildProgram aclBuildProgram
  184. cl_int
  185. (*aclBuildProgram)(cl_program /* program */,
  186. cl_uint /* num_devices */,
  187. const cl_device_id * /* device_list */,
  188. const char * /* options */,
  189. void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
  190. void * /* user_data */);
  191. #define clGetProgramInfo aclGetProgramInfo
  192. cl_int
  193. (*aclGetProgramInfo)(cl_program /* program */,
  194. cl_program_info /* param_name */,
  195. size_t /* param_value_size */,
  196. void * /* param_value */,
  197. size_t * /* param_value_size_ret */);
  198. #define clGetProgramBuildInfo aclGetProgramBuildInfo
  199. cl_int
  200. (*aclGetProgramBuildInfo)(cl_program /* program */,
  201. cl_device_id /* device */,
  202. cl_program_build_info /* param_name */,
  203. size_t /* param_value_size */,
  204. void * /* param_value */,
  205. size_t * /* param_value_size_ret */);
  206. /* Kernel Object APIs */
  207. #define clCreateKernel aclCreateKernel
  208. cl_kernel
  209. (*aclCreateKernel)(cl_program /* program */,
  210. const char * /* kernel_name */,
  211. cl_int * /* errcode_ret */);
  212. #define clCreateKernelsInProgram aclCreateKernelsInProgram
  213. cl_int
  214. (*aclCreateKernelsInProgram)(cl_program /* program */,
  215. cl_uint /* num_kernels */,
  216. cl_kernel * /* kernels */,
  217. cl_uint * /* num_kernels_ret */);
  218. #define clRetainKernel aclRetainKernel
  219. cl_int
  220. (*aclRetainKernel)(cl_kernel /* kernel */);
  221. #define clReleaseKernel aclReleaseKernel
  222. cl_int
  223. (*aclReleaseKernel)(cl_kernel /* kernel */);
  224. #define clSetKernelArg aclSetKernelArg
  225. cl_int
  226. (*aclSetKernelArg)(cl_kernel /* kernel */,
  227. cl_uint /* arg_index */,
  228. size_t /* arg_size */,
  229. const void * /* arg_value */);
  230. #define clGetKernelInfo aclGetKernelInfo
  231. cl_int
  232. (*aclGetKernelInfo)(cl_kernel /* kernel */,
  233. cl_kernel_info /* param_name */,
  234. size_t /* param_value_size */,
  235. void * /* param_value */,
  236. size_t * /* param_value_size_ret */);
  237. #define clGetKernelWorkGroupInfo aclGetKernelWorkGroupInfo
  238. cl_int
  239. (*aclGetKernelWorkGroupInfo)(cl_kernel /* kernel */,
  240. cl_device_id /* device */,
  241. cl_kernel_work_group_info /* param_name */,
  242. size_t /* param_value_size */,
  243. void * /* param_value */,
  244. size_t * /* param_value_size_ret */);
  245. /* Event Object APIs */
  246. #define clWaitForEvents aclWaitForEvents
  247. cl_int
  248. (*aclWaitForEvents)(cl_uint /* num_events */,
  249. const cl_event * /* event_list */);
  250. #define clGetEventInfo aclGetEventInfo
  251. cl_int
  252. (*aclGetEventInfo)(cl_event /* event */,
  253. cl_event_info /* param_name */,
  254. size_t /* param_value_size */,
  255. void * /* param_value */,
  256. size_t * /* param_value_size_ret */);
  257. #define clCreateUserEvent aclCreateUserEvent
  258. cl_event
  259. (*aclCreateUserEvent)(cl_context /* context */,
  260. cl_int * /* errcode_ret */);
  261. #define clRetainEvent aclRetainEvent
  262. cl_int
  263. (*aclRetainEvent)(cl_event /* event */);
  264. #define clReleaseEvent aclReleaseEvent
  265. cl_int
  266. (*aclReleaseEvent)(cl_event /* event */);
  267. #define clSetUserEventStatus aclSetUserEventStatus
  268. cl_int
  269. (*aclSetUserEventStatus)(cl_event /* event */,
  270. cl_int /* execution_status */);
  271. #define clSetEventCallback aclSetEventCallback
  272. cl_int
  273. (*aclSetEventCallback)( cl_event /* event */,
  274. cl_int /* command_exec_callback_type */,
  275. void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
  276. void * /* user_data */);
  277. /* Profiling APIs */
  278. #define clGetEventProfilingInfo aclGetEventProfilingInfo
  279. cl_int
  280. (*aclGetEventProfilingInfo)(cl_event /* event */,
  281. cl_profiling_info /* param_name */,
  282. size_t /* param_value_size */,
  283. void * /* param_value */,
  284. size_t * /* param_value_size_ret */);
  285. /* Flush and Finish APIs */
  286. #define clFlush aclFlush
  287. cl_int
  288. (*aclFlush)(cl_command_queue /* command_queue */);
  289. #define clFinish aclFinish
  290. cl_int
  291. (*aclFinish)(cl_command_queue /* command_queue */);
  292. /* Enqueued Commands APIs */
  293. #define clEnqueueReadBuffer aclEnqueueReadBuffer
  294. cl_int
  295. (*aclEnqueueReadBuffer)(cl_command_queue /* command_queue */,
  296. cl_mem /* buffer */,
  297. cl_bool /* blocking_read */,
  298. size_t /* offset */,
  299. size_t /* size */,
  300. void * /* ptr */,
  301. cl_uint /* num_events_in_wait_list */,
  302. const cl_event * /* event_wait_list */,
  303. cl_event * /* event */);
  304. #define clEnqueueReadBufferRect aclEnqueueReadBufferRect
  305. cl_int
  306. (*aclEnqueueReadBufferRect)(cl_command_queue /* command_queue */,
  307. cl_mem /* buffer */,
  308. cl_bool /* blocking_read */,
  309. const size_t * /* buffer_offset */,
  310. const size_t * /* host_offset */,
  311. const size_t * /* region */,
  312. size_t /* buffer_row_pitch */,
  313. size_t /* buffer_slice_pitch */,
  314. size_t /* host_row_pitch */,
  315. size_t /* host_slice_pitch */,
  316. void * /* ptr */,
  317. cl_uint /* num_events_in_wait_list */,
  318. const cl_event * /* event_wait_list */,
  319. cl_event * /* event */);
  320. #define clEnqueueWriteBuffer aclEnqueueWriteBuffer
  321. cl_int
  322. (*aclEnqueueWriteBuffer)(cl_command_queue /* command_queue */,
  323. cl_mem /* buffer */,
  324. cl_bool /* blocking_write */,
  325. size_t /* offset */,
  326. size_t /* size */,
  327. const void * /* ptr */,
  328. cl_uint /* num_events_in_wait_list */,
  329. const cl_event * /* event_wait_list */,
  330. cl_event * /* event */);
  331. #define clEnqueueWriteBufferRect aclEnqueueWriteBufferRect
  332. cl_int
  333. (*aclEnqueueWriteBufferRect)(cl_command_queue /* command_queue */,
  334. cl_mem /* buffer */,
  335. cl_bool /* blocking_write */,
  336. const size_t * /* buffer_offset */,
  337. const size_t * /* host_offset */,
  338. const size_t * /* region */,
  339. size_t /* buffer_row_pitch */,
  340. size_t /* buffer_slice_pitch */,
  341. size_t /* host_row_pitch */,
  342. size_t /* host_slice_pitch */,
  343. const void * /* ptr */,
  344. cl_uint /* num_events_in_wait_list */,
  345. const cl_event * /* event_wait_list */,
  346. cl_event * /* event */);
  347. #define clEnqueueCopyBuffer aclEnqueueCopyBuffer
  348. cl_int
  349. (*aclEnqueueCopyBuffer)(cl_command_queue /* command_queue */,
  350. cl_mem /* src_buffer */,
  351. cl_mem /* dst_buffer */,
  352. size_t /* src_offset */,
  353. size_t /* dst_offset */,
  354. size_t /* size */,
  355. cl_uint /* num_events_in_wait_list */,
  356. const cl_event * /* event_wait_list */,
  357. cl_event * /* event */);
  358. #define clEnqueueCopyBufferRect aclEnqueueCopyBufferRect
  359. cl_int
  360. (*aclEnqueueCopyBufferRect)(cl_command_queue /* command_queue */,
  361. cl_mem /* src_buffer */,
  362. cl_mem /* dst_buffer */,
  363. const size_t * /* src_origin */,
  364. const size_t * /* dst_origin */,
  365. const size_t * /* region */,
  366. size_t /* src_row_pitch */,
  367. size_t /* src_slice_pitch */,
  368. size_t /* dst_row_pitch */,
  369. size_t /* dst_slice_pitch */,
  370. cl_uint /* num_events_in_wait_list */,
  371. const cl_event * /* event_wait_list */,
  372. cl_event * /* event */);
  373. #define clEnqueueReadImage aclEnqueueReadImage
  374. cl_int
  375. (*aclEnqueueReadImage)(cl_command_queue /* command_queue */,
  376. cl_mem /* image */,
  377. cl_bool /* blocking_read */,
  378. const size_t * /* origin[3] */,
  379. const size_t * /* region[3] */,
  380. size_t /* row_pitch */,
  381. size_t /* slice_pitch */,
  382. void * /* ptr */,
  383. cl_uint /* num_events_in_wait_list */,
  384. const cl_event * /* event_wait_list */,
  385. cl_event * /* event */);
  386. #define clEnqueueWriteImage aclEnqueueWriteImage
  387. cl_int
  388. (*aclEnqueueWriteImage)(cl_command_queue /* command_queue */,
  389. cl_mem /* image */,
  390. cl_bool /* blocking_write */,
  391. const size_t * /* origin[3] */,
  392. const size_t * /* region[3] */,
  393. size_t /* input_row_pitch */,
  394. size_t /* input_slice_pitch */,
  395. const void * /* ptr */,
  396. cl_uint /* num_events_in_wait_list */,
  397. const cl_event * /* event_wait_list */,
  398. cl_event * /* event */);
  399. #define clEnqueueCopyImage aclEnqueueCopyImage
  400. cl_int
  401. (*aclEnqueueCopyImage)(cl_command_queue /* command_queue */,
  402. cl_mem /* src_image */,
  403. cl_mem /* dst_image */,
  404. const size_t * /* src_origin[3] */,
  405. const size_t * /* dst_origin[3] */,
  406. const size_t * /* region[3] */,
  407. cl_uint /* num_events_in_wait_list */,
  408. const cl_event * /* event_wait_list */,
  409. cl_event * /* event */);
  410. #define clEnqueueCopyImageToBuffer aclEnqueueCopyImageToBuffer
  411. cl_int
  412. (*aclEnqueueCopyImageToBuffer)(cl_command_queue /* command_queue */,
  413. cl_mem /* src_image */,
  414. cl_mem /* dst_buffer */,
  415. const size_t * /* src_origin[3] */,
  416. const size_t * /* region[3] */,
  417. size_t /* dst_offset */,
  418. cl_uint /* num_events_in_wait_list */,
  419. const cl_event * /* event_wait_list */,
  420. cl_event * /* event */);
  421. #define clEnqueueCopyBufferToImage aclEnqueueCopyBufferToImage
  422. cl_int
  423. (*aclEnqueueCopyBufferToImage)(cl_command_queue /* command_queue */,
  424. cl_mem /* src_buffer */,
  425. cl_mem /* dst_image */,
  426. size_t /* src_offset */,
  427. const size_t * /* dst_origin[3] */,
  428. const size_t * /* region[3] */,
  429. cl_uint /* num_events_in_wait_list */,
  430. const cl_event * /* event_wait_list */,
  431. cl_event * /* event */);
  432. void *
  433. (*aclEnqueueMapBuffer)(cl_command_queue /* command_queue */,
  434. cl_mem /* buffer */,
  435. cl_bool /* blocking_map */,
  436. cl_map_flags /* map_flags */,
  437. size_t /* offset */,
  438. size_t /* size */,
  439. cl_uint /* num_events_in_wait_list */,
  440. const cl_event * /* event_wait_list */,
  441. cl_event * /* event */,
  442. cl_int * /* errcode_ret */);
  443. void *
  444. (*aclEnqueueMapImage)(cl_command_queue /* command_queue */,
  445. cl_mem /* image */,
  446. cl_bool /* blocking_map */,
  447. cl_map_flags /* map_flags */,
  448. const size_t * /* origin[3] */,
  449. const size_t * /* region[3] */,
  450. size_t * /* image_row_pitch */,
  451. size_t * /* image_slice_pitch */,
  452. cl_uint /* num_events_in_wait_list */,
  453. const cl_event * /* event_wait_list */,
  454. cl_event * /* event */,
  455. cl_int * /* errcode_ret */);
  456. #define clEnqueueUnmapMemObject aclEnqueueUnmapMemObject
  457. cl_int
  458. (*aclEnqueueUnmapMemObject)(cl_command_queue /* command_queue */,
  459. cl_mem /* memobj */,
  460. void * /* mapped_ptr */,
  461. cl_uint /* num_events_in_wait_list */,
  462. const cl_event * /* event_wait_list */,
  463. cl_event * /* event */);
  464. #define clEnqueueNDRangeKernel aclEnqueueNDRangeKernel
  465. cl_int
  466. (*aclEnqueueNDRangeKernel)(cl_command_queue /* command_queue */,
  467. cl_kernel /* kernel */,
  468. cl_uint /* work_dim */,
  469. const size_t * /* global_work_offset */,
  470. const size_t * /* global_work_size */,
  471. const size_t * /* local_work_size */,
  472. cl_uint /* num_events_in_wait_list */,
  473. const cl_event * /* event_wait_list */,
  474. cl_event * /* event */);
  475. #define clEnqueueTask aclEnqueueTask
  476. cl_int
  477. (*aclEnqueueTask)(cl_command_queue /* command_queue */,
  478. cl_kernel /* kernel */,
  479. cl_uint /* num_events_in_wait_list */,
  480. const cl_event * /* event_wait_list */,
  481. cl_event * /* event */);
  482. #define clEnqueueNativeKernel aclEnqueueNativeKernel
  483. cl_int
  484. (*aclEnqueueNativeKernel)(cl_command_queue /* command_queue */,
  485. void (CL_CALLBACK * /*user_func*/)(void *),
  486. void * /* args */,
  487. size_t /* cb_args */,
  488. cl_uint /* num_mem_objects */,
  489. const cl_mem * /* mem_list */,
  490. const void ** /* args_mem_loc */,
  491. cl_uint /* num_events_in_wait_list */,
  492. const cl_event * /* event_wait_list */,
  493. cl_event * /* event */);
  494. #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
  495. //#warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1!
  496. /*
  497. * WARNING:
  498. * This API introduces mutable state into the OpenCL implementation. It has been REMOVED
  499. * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the
  500. * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably.
  501. * It is likely to be non-performant. Use of this API is not advised. Use at your own risk.
  502. *
  503. * Software developers previously relying on this API are instructed to set the command queue
  504. * properties when creating the queue, instead.
  505. */
  506. #define clSetCommandQueueProperty aclSetCommandQueueProperty
  507. cl_int
  508. (*aclSetCommandQueueProperty)(cl_command_queue /* command_queue */,
  509. cl_command_queue_properties /* properties */,
  510. cl_bool /* enable */,
  511. cl_command_queue_properties * /* old_properties */);
  512. #endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */
  513. #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
  514. #define clCreateImage2D aclCreateImage2D
  515. cl_mem
  516. (*aclCreateImage2D)(cl_context /* context */,
  517. cl_mem_flags /* flags */,
  518. const cl_image_format * /* image_format */,
  519. size_t /* image_width */,
  520. size_t /* image_height */,
  521. size_t /* image_row_pitch */,
  522. void * /* host_ptr */,
  523. cl_int * /* errcode_ret */);
  524. #define clCreateImage3D aclCreateImage3D
  525. cl_mem
  526. (*aclCreateImage3D)(cl_context /* context */,
  527. cl_mem_flags /* flags */,
  528. const cl_image_format * /* image_format */,
  529. size_t /* image_width */,
  530. size_t /* image_height */,
  531. size_t /* image_depth */,
  532. size_t /* image_row_pitch */,
  533. size_t /* image_slice_pitch */,
  534. void * /* host_ptr */,
  535. cl_int * /* errcode_ret */);
  536. #define clEnqueueMarker aclEnqueueMarker
  537. cl_int
  538. (*aclEnqueueMarker)(cl_command_queue /* command_queue */,
  539. cl_event * /* event */);
  540. #define clEnqueueWaitForEvents aclEnqueueWaitForEvents
  541. cl_int
  542. (*aclEnqueueWaitForEvents)(cl_command_queue /* command_queue */,
  543. cl_uint /* num_events */,
  544. const cl_event * /* event_list */);
  545. #define clEnqueueBarrier aclEnqueueBarrier
  546. cl_int
  547. (*aclEnqueueBarrier)(cl_command_queue /* command_queue */);
  548. #define clUnloadCompiler aclUnloadCompiler
  549. cl_int
  550. (*aclUnloadCompiler)(void);
  551. void *
  552. (*aclGetExtensionFunctionAddress)(const char * /* func_name */);
  553. #endif
  554. #ifdef __cplusplus
  555. }
  556. #endif
  557. #endif /* __AOPENCL_CL_H */

dlopencl.cpp

根据实际情况自行修改 so_path 的路径

  1. #define CL_TARGET_OPENCL_VERSION 120
  2. #include "CL/cl.h"
  3. #include <dlfcn.h>
  4. #include <cstdio>
  5. #include <string.h>
  6. #include "dlopencl.h"
  7. int loadedCL;
  8. void *getCLHandle() {
  9. LOGD("get_handle");
  10. void *res = nullptr;
  11. char *so_path = (char*)"/system/vendor/lib64/egl/libGLES_mali.so";
  12. res = dlopen(so_path, RTLD_LAZY);
  13. if (res == nullptr) {
  14. LOGD("Open library failed");
  15. } else {
  16. LOGD("Loaded library name: [%s]", so_path);
  17. }
  18. return res;
  19. }
  20. void initFns() {
  21. loadedCL = 0;
  22. void *handle = getCLHandle();
  23. if (handle == nullptr) return;
  24. /* Platform API */
  25. IAH();
  26. aclGetPlatformIDs = (cl_int (*)(cl_uint /* num_entries */,
  27. cl_platform_id * /* platforms */,
  28. cl_uint * /* num_platforms */)) dlsym(handle, "clGetPlatformIDs");
  29. IAH();
  30. aclGetPlatformInfo = (cl_int (*)(cl_platform_id /* platform */,
  31. cl_platform_info /* param_name */,
  32. size_t /* param_value_size */,
  33. void * /* param_value */,
  34. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetPlatformInfo");
  35. /* Device APIs */
  36. IAH();
  37. aclGetDeviceIDs = (cl_int (*)(cl_platform_id /* platform */,
  38. cl_device_type /* device_type */,
  39. cl_uint /* num_entries */,
  40. cl_device_id * /* devices */,
  41. cl_uint * /* num_devices */)) dlsym(handle, "clGetDeviceIDs");
  42. IAH();
  43. aclGetDeviceInfo = (cl_int (*)(cl_device_id /* device */,
  44. cl_device_info /* param_name */,
  45. size_t /* param_value_size */,
  46. void * /* param_value */,
  47. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetDeviceInfo");
  48. /* Context APIs */
  49. IAH();
  50. aclCreateContext = (cl_context (*)(const cl_context_properties * /* properties */,
  51. cl_uint /* num_devices */,
  52. const cl_device_id * /* devices */,
  53. void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *),
  54. void * /* user_data */,
  55. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateContext");
  56. IAH();
  57. aclCreateContextFromType = (cl_context (*)(const cl_context_properties * /* properties */,
  58. cl_device_type /* device_type */,
  59. void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *),
  60. void * /* user_data */,
  61. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateContextFromType");
  62. IAH();
  63. aclRetainContext = (cl_int (*)(cl_context /* context */)) dlsym(handle, "clRetainContext");
  64. IAH();
  65. aclReleaseContext = (cl_int (*)(cl_context /* context */)) dlsym(handle, "clReleaseContext");
  66. IAH();
  67. aclGetContextInfo = (cl_int (*)(cl_context /* context */,
  68. cl_context_info /* param_name */,
  69. size_t /* param_value_size */,
  70. void * /* param_value */,
  71. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetContextInfo");
  72. /* Command Queue APIs */
  73. IAH();
  74. aclCreateCommandQueue = (cl_command_queue (*)(cl_context /* context */,
  75. cl_device_id /* device */,
  76. cl_command_queue_properties /* properties */,
  77. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateCommandQueue");
  78. IAH();
  79. aclRetainCommandQueue = (cl_int (*)(cl_command_queue /* command_queue */)) dlsym(handle, "clRetainCommandQueue");
  80. IAH();
  81. aclReleaseCommandQueue = (cl_int (*)(cl_command_queue /* command_queue */)) dlsym(handle, "clReleaseCommandQueue");
  82. IAH();
  83. aclGetCommandQueueInfo = (cl_int (*)(cl_command_queue /* command_queue */,
  84. cl_command_queue_info /* param_name */,
  85. size_t /* param_value_size */,
  86. void * /* param_value */,
  87. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetCommandQueueInfo");
  88. /* Memory Object APIs */
  89. IAH();
  90. aclCreateBuffer = (cl_mem (*)(cl_context /* context */,
  91. cl_mem_flags /* flags */,
  92. size_t /* size */,
  93. void * /* host_ptr */,
  94. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateBuffer");
  95. IAH();
  96. aclCreateSubBuffer = (cl_mem (*)(cl_mem /* buffer */,
  97. cl_mem_flags /* flags */,
  98. cl_buffer_create_type /* buffer_create_type */,
  99. const void * /* buffer_create_info */,
  100. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateSubBuffer");
  101. IAH();
  102. aclRetainMemObject = (cl_int (*)(cl_mem /* memobj */)) dlsym(handle, "clRetainMemObject");
  103. IAH();
  104. aclReleaseMemObject = (cl_int (*)(cl_mem /* memobj */)) dlsym(handle, "clReleaseMemObject");
  105. IAH();
  106. aclGetSupportedImageFormats = (cl_int (*)(cl_context /* context */,
  107. cl_mem_flags /* flags */,
  108. cl_mem_object_type /* image_type */,
  109. cl_uint /* num_entries */,
  110. cl_image_format * /* image_formats */,
  111. cl_uint * /* num_image_formats */)) dlsym(handle, "clGetSupportedImageFormats");
  112. IAH();
  113. aclGetMemObjectInfo = (cl_int (*)(cl_mem /* memobj */,
  114. cl_mem_info /* param_name */,
  115. size_t /* param_value_size */,
  116. void * /* param_value */,
  117. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetMemObjectInfo");
  118. IAH();
  119. aclGetImageInfo = (cl_int (*)(cl_mem /* image */,
  120. cl_image_info /* param_name */,
  121. size_t /* param_value_size */,
  122. void * /* param_value */,
  123. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetImageInfo");
  124. IAH();
  125. aclSetMemObjectDestructorCallback = (cl_int (*)( cl_mem /* memobj */,
  126. void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
  127. void * /*user_data */ )) dlsym(handle, "clSetMemObjectDestructorCallback");
  128. /* Sampler APIs */
  129. IAH();
  130. aclCreateSampler = (cl_sampler (*)(cl_context /* context */,
  131. cl_bool /* normalized_coords */,
  132. cl_addressing_mode /* addressing_mode */,
  133. cl_filter_mode /* filter_mode */,
  134. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateSampler");
  135. IAH();
  136. aclRetainSampler = (cl_int (*)(cl_sampler /* sampler */)) dlsym(handle, "clRetainSampler");
  137. IAH();
  138. aclReleaseSampler = (cl_int (*)(cl_sampler /* sampler */)) dlsym(handle, "clReleaseSampler");
  139. IAH();
  140. aclGetSamplerInfo = (cl_int (*)(cl_sampler /* sampler */,
  141. cl_sampler_info /* param_name */,
  142. size_t /* param_value_size */,
  143. void * /* param_value */,
  144. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetSamplerInfo");
  145. /* Program Object APIs */
  146. IAH();
  147. aclCreateProgramWithSource = (cl_program (*)(cl_context /* context */,
  148. cl_uint /* count */,
  149. const char ** /* strings */,
  150. const size_t * /* lengths */,
  151. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateProgramWithSource");
  152. IAH();
  153. aclCreateProgramWithBinary = (cl_program (*)(cl_context /* context */,
  154. cl_uint /* num_devices */,
  155. const cl_device_id * /* device_list */,
  156. const size_t * /* lengths */,
  157. const unsigned char ** /* binaries */,
  158. cl_int * /* binary_status */,
  159. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateProgramWithBinary");
  160. IAH();
  161. aclRetainProgram = (cl_int (*)(cl_program /* program */)) dlsym(handle, "clRetainProgram");
  162. IAH();
  163. aclReleaseProgram = (cl_int (*)(cl_program /* program */)) dlsym(handle, "clReleaseProgram");
  164. IAH();
  165. aclBuildProgram = (cl_int (*)(cl_program /* program */,
  166. cl_uint /* num_devices */,
  167. const cl_device_id * /* device_list */,
  168. const char * /* options */,
  169. void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
  170. void * /* user_data */)) dlsym(handle, "clBuildProgram");
  171. IAH();
  172. aclGetProgramInfo = (cl_int (*)(cl_program /* program */,
  173. cl_program_info /* param_name */,
  174. size_t /* param_value_size */,
  175. void * /* param_value */,
  176. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetProgramInfo");
  177. IAH();
  178. aclGetProgramBuildInfo = (cl_int (*)(cl_program /* program */,
  179. cl_device_id /* device */,
  180. cl_program_build_info /* param_name */,
  181. size_t /* param_value_size */,
  182. void * /* param_value */,
  183. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetProgramBuildInfo");
  184. /* Kernel Object APIs */
  185. IAH();
  186. aclCreateKernel = (cl_kernel (*)(cl_program /* program */,
  187. const char * /* kernel_name */,
  188. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateKernel");
  189. IAH();
  190. aclCreateKernelsInProgram = (cl_int (*)(cl_program /* program */,
  191. cl_uint /* num_kernels */,
  192. cl_kernel * /* kernels */,
  193. cl_uint * /* num_kernels_ret */)) dlsym(handle, "clCreateKernelsInProgram");
  194. IAH();
  195. aclRetainKernel = (cl_int (*)(cl_kernel /* kernel */)) dlsym(handle, "clRetainKernel");
  196. IAH();
  197. aclReleaseKernel = (cl_int (*)(cl_kernel /* kernel */)) dlsym(handle, "clReleaseKernel");
  198. IAH();
  199. aclSetKernelArg = (cl_int (*)(cl_kernel /* kernel */,
  200. cl_uint /* arg_index */,
  201. size_t /* arg_size */,
  202. const void * /* arg_value */)) dlsym(handle, "clSetKernelArg");
  203. IAH();
  204. aclGetKernelInfo = (cl_int (*)(cl_kernel /* kernel */,
  205. cl_kernel_info /* param_name */,
  206. size_t /* param_value_size */,
  207. void * /* param_value */,
  208. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetKernelInfo");
  209. IAH();
  210. aclGetKernelWorkGroupInfo = (cl_int (*)(cl_kernel /* kernel */,
  211. cl_device_id /* device */,
  212. cl_kernel_work_group_info /* param_name */,
  213. size_t /* param_value_size */,
  214. void * /* param_value */,
  215. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetKernelWorkGroupInfo");
  216. /* Event Object APIs */
  217. IAH();
  218. aclWaitForEvents = (cl_int (*)(cl_uint /* num_events */,
  219. const cl_event * /* event_list */)) dlsym(handle, "clWaitForEvents");
  220. IAH();
  221. aclGetEventInfo = (cl_int (*)(cl_event /* event */,
  222. cl_event_info /* param_name */,
  223. size_t /* param_value_size */,
  224. void * /* param_value */,
  225. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetEventInfo");
  226. IAH();
  227. aclCreateUserEvent = (cl_event (*)(cl_context /* context */,
  228. cl_int * /* errcode_ret */)) dlsym(handle, "clCreateUserEvent");
  229. IAH();
  230. aclRetainEvent = (cl_int (*)(cl_event /* event */)) dlsym(handle, "clRetainEvent");
  231. IAH();
  232. aclReleaseEvent = (cl_int (*)(cl_event /* event */)) dlsym(handle, "clReleaseEvent");
  233. IAH();
  234. aclSetUserEventStatus = (cl_int (*)(cl_event /* event */,
  235. cl_int /* execution_status */)) dlsym(handle, "clSetUserEventStatus");
  236. IAH();
  237. aclSetEventCallback = (cl_int (*)( cl_event /* event */,
  238. cl_int /* command_exec_callback_type */,
  239. void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
  240. void * /* user_data */)) dlsym(handle, "clSetEventCallback");
  241. /* Profiling APIs */
  242. IAH();
  243. aclGetEventProfilingInfo = (cl_int (*)(cl_event /* event */,
  244. cl_profiling_info /* param_name */,
  245. size_t /* param_value_size */,
  246. void * /* param_value */,
  247. size_t * /* param_value_size_ret */)) dlsym(handle, "clGetEventProfilingInfo");
  248. /* Flush and Finish APIs */
  249. IAH();
  250. aclFlush = (cl_int (*)(cl_command_queue /* command_queue */)) dlsym(handle, "clFlush");
  251. IAH();
  252. aclFinish = (cl_int (*)(cl_command_queue /* command_queue */)) dlsym(handle, "clFinish");
  253. /* Enqueued Commands APIs */
  254. IAH();
  255. aclEnqueueReadBuffer = (cl_int (*)(cl_command_queue /* command_queue */,
  256. cl_mem /* buffer */,
  257. cl_bool /* blocking_read */,
  258. size_t /* offset */,
  259. size_t /* size */,
  260. void * /* ptr */,
  261. cl_uint /* num_events_in_wait_list */,
  262. const cl_event * /* event_wait_list */,
  263. cl_event * /* event */)) dlsym(handle, "clEnqueueReadBuffer");
  264. IAH();
  265. aclEnqueueReadBufferRect = (cl_int (*)(cl_command_queue /* command_queue */,
  266. cl_mem /* buffer */,
  267. cl_bool /* blocking_read */,
  268. const size_t * /* buffer_offset */,
  269. const size_t * /* host_offset */,
  270. const size_t * /* region */,
  271. size_t /* buffer_row_pitch */,
  272. size_t /* buffer_slice_pitch */,
  273. size_t /* host_row_pitch */,
  274. size_t /* host_slice_pitch */,
  275. void * /* ptr */,
  276. cl_uint /* num_events_in_wait_list */,
  277. const cl_event * /* event_wait_list */,
  278. cl_event * /* event */)) dlsym(handle, "clEnqueueReadBufferRect");
  279. IAH();
  280. aclEnqueueWriteBuffer = (cl_int (*)(cl_command_queue /* command_queue */,
  281. cl_mem /* buffer */,
  282. cl_bool /* blocking_write */,
  283. size_t /* offset */,
  284. size_t /* size */,
  285. const void * /* ptr */,
  286. cl_uint /* num_events_in_wait_list */,
  287. const cl_event * /* event_wait_list */,
  288. cl_event * /* event */)) dlsym(handle, "clEnqueueWriteBuffer");
  289. IAH();
  290. aclEnqueueWriteBufferRect = (cl_int (*)(cl_command_queue /* command_queue */,
  291. cl_mem /* buffer */,
  292. cl_bool /* blocking_write */,
  293. const size_t * /* buffer_offset */,
  294. const size_t * /* host_offset */,
  295. const size_t * /* region */,
  296. size_t /* buffer_row_pitch */,
  297. size_t /* buffer_slice_pitch */,
  298. size_t /* host_row_pitch */,
  299. size_t /* host_slice_pitch */,
  300. const void * /* ptr */,
  301. cl_uint /* num_events_in_wait_list */,
  302. const cl_event * /* event_wait_list */,
  303. cl_event * /* event */)) dlsym(handle, "clEnqueueWriteBufferRect");
  304. IAH();
  305. aclEnqueueCopyBuffer = (cl_int (*)(cl_command_queue /* command_queue */,
  306. cl_mem /* src_buffer */,
  307. cl_mem /* dst_buffer */,
  308. size_t /* src_offset */,
  309. size_t /* dst_offset */,
  310. size_t /* size */,
  311. cl_uint /* num_events_in_wait_list */,
  312. const cl_event * /* event_wait_list */,
  313. cl_event * /* event */)) dlsym(handle, "clEnqueueCopyBuffer");
  314. IAH();
  315. aclEnqueueCopyBufferRect = (cl_int (*)(cl_command_queue /* command_queue */,
  316. cl_mem /* src_buffer */,
  317. cl_mem /* dst_buffer */,
  318. const size_t * /* src_origin */,
  319. const size_t * /* dst_origin */,
  320. const size_t * /* region */,
  321. size_t /* src_row_pitch */,
  322. size_t /* src_slice_pitch */,
  323. size_t /* dst_row_pitch */,
  324. size_t /* dst_slice_pitch */,
  325. cl_uint /* num_events_in_wait_list */,
  326. const cl_event * /* event_wait_list */,
  327. cl_event * /* event */)) dlsym(handle, "clEnqueueCopyBufferRect");
  328. IAH();
  329. aclEnqueueReadImage = (cl_int (*)(cl_command_queue /* command_queue */,
  330. cl_mem /* image */,
  331. cl_bool /* blocking_read */,
  332. const size_t * /* origin[3] */,
  333. const size_t * /* region[3] */,
  334. size_t /* row_pitch */,
  335. size_t /* slice_pitch */,
  336. void * /* ptr */,
  337. cl_uint /* num_events_in_wait_list */,
  338. const cl_event * /* event_wait_list */,
  339. cl_event * /* event */)) dlsym(handle, "clEnqueueReadImage");
  340. IAH();
  341. aclEnqueueWriteImage = (cl_int (*)(cl_command_queue /* command_queue */,
  342. cl_mem /* image */,
  343. cl_bool /* blocking_write */,
  344. const size_t * /* origin[3] */,
  345. const size_t * /* region[3] */,
  346. size_t /* input_row_pitch */,
  347. size_t /* input_slice_pitch */,
  348. const void * /* ptr */,
  349. cl_uint /* num_events_in_wait_list */,
  350. const cl_event * /* event_wait_list */,
  351. cl_event * /* event */)) dlsym(handle, "clEnqueueWriteImage");
  352. IAH();
  353. aclEnqueueCopyImage = (cl_int (*)(cl_command_queue /* command_queue */,
  354. cl_mem /* src_image */,
  355. cl_mem /* dst_image */,
  356. const size_t * /* src_origin[3] */,
  357. const size_t * /* dst_origin[3] */,
  358. const size_t * /* region[3] */,
  359. cl_uint /* num_events_in_wait_list */,
  360. const cl_event * /* event_wait_list */,
  361. cl_event * /* event */)) dlsym(handle, "clEnqueueCopyImage");
  362. IAH();
  363. aclEnqueueCopyImageToBuffer = (cl_int (*)(cl_command_queue /* command_queue */,
  364. cl_mem /* src_image */,
  365. cl_mem /* dst_buffer */,
  366. const size_t * /* src_origin[3] */,
  367. const size_t * /* region[3] */,
  368. size_t /* dst_offset */,
  369. cl_uint /* num_events_in_wait_list */,
  370. const cl_event * /* event_wait_list */,
  371. cl_event * /* event */)) dlsym(handle, "clEnqueueCopyImageToBuffer");
  372. IAH();
  373. aclEnqueueCopyBufferToImage = (cl_int (*)(cl_command_queue /* command_queue */,
  374. cl_mem /* src_buffer */,
  375. cl_mem /* dst_image */,
  376. size_t /* src_offset */,
  377. const size_t * /* dst_origin[3] */,
  378. const size_t * /* region[3] */,
  379. cl_uint /* num_events_in_wait_list */,
  380. const cl_event * /* event_wait_list */,
  381. cl_event * /* event */)) dlsym(handle, "clEnqueueCopyBufferToImage");
  382. #if 0
  383. void *
  384. (*aclEnqueueMapBuffer)(cl_command_queue /* command_queue */,
  385. cl_mem /* buffer */,
  386. cl_bool /* blocking_map */,
  387. cl_map_flags /* map_flags */,
  388. size_t /* offset */,
  389. size_t /* size */,
  390. cl_uint /* num_events_in_wait_list */,
  391. const cl_event * /* event_wait_list */,
  392. cl_event * /* event */,
  393. cl_int * /* errcode_ret */)) dlsym(handle,"");
  394. void *
  395. (*aclEnqueueMapImage)(cl_command_queue /* command_queue */,
  396. cl_mem /* image */,
  397. cl_bool /* blocking_map */,
  398. cl_map_flags /* map_flags */,
  399. const size_t * /* origin[3] */,
  400. const size_t * /* region[3] */,
  401. size_t * /* image_row_pitch */,
  402. size_t * /* image_slice_pitch */,
  403. cl_uint /* num_events_in_wait_list */,
  404. const cl_event * /* event_wait_list */,
  405. cl_event * /* event */,
  406. cl_int * /* errcode_ret */)) dlsym(handle,"");
  407. #endif
  408. IAH();
  409. aclEnqueueUnmapMemObject = (cl_int (*)(cl_command_queue /* command_queue */,
  410. cl_mem /* memobj */,
  411. void * /* mapped_ptr */,
  412. cl_uint /* num_events_in_wait_list */,
  413. const cl_event * /* event_wait_list */,
  414. cl_event * /* event */)) dlsym(handle, "clEnqueueUnmapMemObject");
  415. IAH();
  416. aclEnqueueNDRangeKernel = (cl_int (*)(cl_command_queue /* command_queue */,
  417. cl_kernel /* kernel */,
  418. cl_uint /* work_dim */,
  419. const size_t * /* global_work_offset */,
  420. const size_t * /* global_work_size */,
  421. const size_t * /* local_work_size */,
  422. cl_uint /* num_events_in_wait_list */,
  423. const cl_event * /* event_wait_list */,
  424. cl_event * /* event */)) dlsym(handle, "clEnqueueNDRangeKernel");
  425. IAH();
  426. aclEnqueueTask = (cl_int (*)(cl_command_queue /* command_queue */,
  427. cl_kernel /* kernel */,
  428. cl_uint /* num_events_in_wait_list */,
  429. const cl_event * /* event_wait_list */,
  430. cl_event * /* event */)) dlsym(handle, "clEnqueueTask");
  431. IAH();
  432. aclEnqueueNativeKernel = (cl_int (*)(cl_command_queue /* command_queue */,
  433. void (CL_CALLBACK * /*user_func*/)(void *),
  434. void * /* args */,
  435. size_t /* cb_args */,
  436. cl_uint /* num_mem_objects */,
  437. const cl_mem * /* mem_list */,
  438. const void ** /* args_mem_loc */,
  439. cl_uint /* num_events_in_wait_list */,
  440. const cl_event * /* event_wait_list */,
  441. cl_event * /* event */)) dlsym(handle, "clEnqueueNativeKernel");
  442. #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
  443. //#warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1!
  444. /*
  445. * WARNING:
  446. * This API introduces mutable state into the OpenCL implementation. It has been REMOVED
  447. * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the
  448. * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably.
  449. * It is likely to be non-performant. Use of this API is not advised. Use at your own risk.
  450. *
  451. * Software developers previously relying on this API are instructed to set the command queue
  452. * properties when creating the queue, instead.
  453. */
  454. IAH();
  455. aclSetCommandQueueProperty = (cl_int (*)(cl_command_queue /* command_queue */,
  456. cl_command_queue_properties /* properties */,
  457. cl_bool /* enable */,
  458. cl_command_queue_properties * /* old_properties */)) dlsym(handle,"clSetCommandQueueProperty");
  459. #endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */
  460. #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
  461. IAH();
  462. aclCreateImage2D = (cl_mem (*)(cl_context /* context */,
  463. cl_mem_flags /* flags */,
  464. const cl_image_format * /* image_format */,
  465. size_t /* image_width */,
  466. size_t /* image_height */,
  467. size_t /* image_row_pitch */,
  468. void * /* host_ptr */,
  469. cl_int * /* errcode_ret */)) dlsym(handle,"clCreateImage2D");
  470. IAH();
  471. aclCreateImage3D = (cl_mem (*)(cl_context /* context */,
  472. cl_mem_flags /* flags */,
  473. const cl_image_format * /* image_format */,
  474. size_t /* image_width */,
  475. size_t /* image_height */,
  476. size_t /* image_depth */,
  477. size_t /* image_row_pitch */,
  478. size_t /* image_slice_pitch */,
  479. void * /* host_ptr */,
  480. cl_int * /* errcode_ret */)) dlsym(handle,"clCreateImage3D");
  481. IAH();
  482. aclEnqueueMarker = (cl_int (*)(cl_command_queue /* command_queue */,
  483. cl_event * /* event */)) dlsym(handle,"clEnqueueMarker");
  484. IAH();
  485. aclEnqueueWaitForEvents = (cl_int (*)(cl_command_queue /* command_queue */,
  486. cl_uint /* num_events */,
  487. const cl_event * /* event_list */)) dlsym(handle,"clEnqueueWaitForEvents");
  488. IAH();
  489. aclEnqueueBarrier = (cl_int (*)(cl_command_queue /* command_queue */)) dlsym(handle,"clEnqueueBarrier");
  490. IAH();
  491. aclUnloadCompiler = (cl_int (*)(void)) dlsym(handle,"clUnloadCompiler");
  492. #endif
  493. #if 0
  494. void *
  495. (*aclGetExtensionFunctionAddress)(const char * /* func_name */)) dlsym(handle,"");
  496. #endif
  497. loadedCL = 1;
  498. }

Android AARCH64 平台的 OpenCL 配置的更多相关文章

  1. Android 开发平台的演变史

    Android开发平台的发展(并不是很懂) Eclipse 首先是由IBM的一个项目小组花了两年时间开发完成的,当时主要解决IBM开发工具 Visual Age for Java 和 WebSpher ...

  2. 论文第5章:Android绘图平台的实现

    面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...

  3. Android 2D游戏引擎AndEngine配置环境

    Android 2D游戏引擎AndEngine配置环境 1.2  配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和 ...

  4. 第三章Android移植平台工具介绍

    第三章Android移植平台工具介绍 进行 Android 移植的学习并不一定需要一款 Android 手机,但必须要有一款主流的开发板,开发板是用来进行嵌入式系统开发的电路板,包括中央处理器.存储器 ...

  5. 2018年Unity结合Android SDK下载安装及配置教程

    原文:2018年Unity结合Android SDK下载安装及配置教程 首先声明: Unity版本2017.1f3        最近试着在Unity中利用网易做AR开发时,发布项目文件需要发布到An ...

  6. 使用ndk交叉编译android各平台版本的第三方库

    只要弄明白了ndk-bundle的目录结构,交叉编译的基本原理就可以自行编写脚本去编译了.从仓库拿下代码包后,一般在linux平台下编译当前平台使用的库,只要使用其自动配置脚本configure进行平 ...

  7. Unity5.2.1上Android真机调试环境配置

    下载SDK,JDK安装,配置JAVA环境 1.下载SDK,下载adt-bundle-windows-x86_64-20131030.zip,下载地址:http://pan.baidu.com/shar ...

  8. 作业一:android开发平台的演变以及Android Studio设置

    目录:     ①. 从Eclipse到Android Studio   ②. Android Studio的下载和安装   ③. 用户习惯设置以及快捷键   ④. SDK路径重新设置 ↓点此跳转到文 ...

  9. Android SDK 国内镜像及配置方法

    东软信息学院的 Android SDK 镜像,比配置代理下载快. 配置地址, http://mirrors.neusoft.edu.cn/configurations.we#android 配置步骤: ...

随机推荐

  1. Transformer, ELMo, GPT, 到Bert

    RNN:难以并行 CNN:filter只能考虑局部的信息,要叠多层 Self-attention:可以考虑全局的信息,并且可以并行 (Attention Is All You Need) 示意图:x1 ...

  2. java8学习之收集器用法详解与多级分组和分区

    收集器用法详解: 在上次已经系统的阅读了Collector收集器的Javadoc对它已经有一个比较详细的认知了,但是!!!它毕境是只是一个接口,要使用的话还得用它的实现类,所以在Java8中有它进行了 ...

  3. Python——枚举(enum)

  4. QR分解迭代求特征值——原生python实现(不使用numpy)

    QR分解: 有很多方法可以进行QR迭代,本文使用的是Schmidt正交化方法 具体证明请参考链接 https://wenku.baidu.com/view/c2e34678168884868762d6 ...

  5. Http请求Response Code含义

    http状态返回代码 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码.100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分.101 ...

  6. 在CentOS/Windows下配置Nginx(以及踩坑)

    在CentOS/Windows下配置Nginx(以及踩坑) 1. 序言 因为这类文章网上比较多,实际操作起来也大同小异,所以我并不会着重于详细配置方面,而是将我配置时踩的坑写出来. 2. CentOS ...

  7. python 的pip安装

    C:\Python27>C:\Python27\Scripts\pip.exe install gevent gevent是安装的模块名

  8. <label>标签的相关内容

    ㈠<label>标签的定义与用法 ⑴<label> 标签为 input 元素定义标注(标记). ⑵label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如 ...

  9. head first 设计模式笔记2-观察者模式:气象观测站

    设计原则:为了交互对象之间的松耦合设计而努力. 1.设计模式的一些理解 1)知道OO基础,并不足以让你设计出良好的OO系统 2)良好的OO设计必须具备可复用.可扩充.可维护三个特性 3)模式可以让我们 ...

  10. js获取iframe里面的dom

    最近在写页面遇到了问题,一个dom好多地方用到,然后我就单独写了个html页面,然后用iframe引入,但是,想获取iframe里面input的value,获取不到input,后面才知道原来js不能直 ...