本文测试OpenCL中读取image数据时关于坐标的两个问题:

  1. 使用float2坐标读取
  2. 使用int2坐标读取

首先完整的测试代码如下,测试平台为SDM855:

  1. #include <CL/cl.h>
  2. #include <iostream>
  3. #include <vector>
  4. #include <math.h>
  5. #include "OCL/OPPOOpenCLWrapper.h"
  6. #include "OCL/OCLUtils.h"
  7. #ifndef uchar
  8. #define uchar unsigned char
  9. #endif
  10. const char code[] = R"(
  11. const sampler_t samp1 = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_LINEAR;
  12. __kernel void readtest(read_only image2d_t src, global uchar *dst)
  13. {
  14. int2 coord = (int2)(get_global_id(0), get_global_id(1));
  15. if(coord.x == 0 && coord.y == 0){
  16. printf("(float2)(0.0, 0.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 0.0) ).x * 255.0);
  17. printf("(float2)(0.0, 1.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 1.0) ).x * 255.0);
  18. printf("(float2)(0.0, 1.5) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 1.5) ).x * 255.0);
  19. printf("(float2)(0.0, 2.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 2.0) ).x * 255.0);
  20. printf("(float2)(1.5, 1.5) read:%f \n", read_imagef(src, samp1, (float2)(1.5, 1.5) ).x * 255.0);
  21. printf("(float2)(0.5, 2.0) read:%f \n", read_imagef(src, samp1, (float2)(0.5, 2.0) ).x * 255.0);
  22. printf("(float2)(0.5, 2.5) read:%f \n", read_imagef(src, samp1, (float2)(0.5, 2.5) ).x * 255.0);
  23. printf("(float2)(1.0, 1.0) read:%f \n", read_imagef(src, samp1, (float2)(1.0, 1.0) ).x * 255.0);
  24. printf("(float2)(254.0, 254.0) read:%f \n", read_imagef(src, samp1, (float2)(254.0, 254.0) ).x * 255.0);
  25. printf("(float2)(255.0, 255.0) read:%f \n", read_imagef(src, samp1, (float2)(255.0, 255.0) ).x * 255.0);
  26. printf("(float2)(255.5, 255.5) read:%f \n", read_imagef(src, samp1, (float2)(255.5, 255.5) ).x * 255.0);
  27. printf("(float2)(256.0, 256.0) read:%f \n", read_imagef(src, samp1, (float2)(256.0, 256.0) ).x * 255.0);
  28. printf("(float2)(300, 300.0) read:%f \n", read_imagef(src, samp1, (float2)(300.0, 300.0) ).x * 255.0);
  29. printf("(int2)(1, 1) read:%f \n", read_imagef(src, samp1, (int2)(1, 1) ).x * 255.0);
  30. printf("(int2)(0, 0) read:%f \n", read_imagef(src, samp1, (int2)(0, 0) ).x * 255.0);
  31. printf("(int2)(1, 2) read:%f \n", read_imagef(src, samp1, (int2)(1, 2) ).x * 255.0);
  32. printf("(int2)(254, 254) read:%f \n", read_imagef(src, samp1, (int2)(254, 254) ).x * 255.0);
  33. printf("(int2)(255, 255) read:%f \n", read_imagef(src, samp1, (int2)(255, 255) ).x * 255.0);
  34. printf("(int2)(256, 256) read:%f \n", read_imagef(src, samp1, (int2)(256, 256) ).x * 255.0);
  35. printf("(int2)(257, 257) read:%f \n", read_imagef(src, samp1, (int2)(257, 257) ).x * 255.0);
  36. }
  37. }
  38. )";
  39. void testsamp05()
  40. {
  41. OPPOOpenCLWrapper ocl;
  42. cl_image_format imageformat;
  43. imageformat.image_channel_data_type = CL_UNORM_INT8;
  44. imageformat.image_channel_order = CL_R;
  45. cl_image_desc imagedesc;
  46. memset(&imagedesc, 0, sizeof(imagedesc));
  47. imagedesc.image_width = 256;
  48. imagedesc.image_height = 256;
  49. imagedesc.image_type = CL_MEM_OBJECT_IMAGE2D;
  50. std::vector<uchar> data(256*256, 0);
  51. for(int i = 0; i < 256; ++i){
  52. for(int w = 0; w < 256; ++w){
  53. data[i*256+w] = std::max(i, w);
  54. }
  55. }
  56. cl_int err;
  57. cl_mem src = clCreateImage(ocl.getContext(), CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, &imageformat, &imagedesc, data.data(), &err);
  58. checkErr(err, "src");
  59. cl_mem dst = clCreateBuffer(ocl.getContext(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, 256*256, NULL, &err);
  60. checkErr(err, "dst");
  61. const char *pcode = code;
  62. cl_program prog = ocl.makeProgram(&pcode, sizeof(code) / sizeof(code[0]));
  63. cl_kernel kernel = ocl.makeKernel(prog, "readtest");
  64. clSetKernelArg(kernel , 0, sizeof(src), &src);
  65. clSetKernelArg(kernel , 1, sizeof(dst), &dst);
  66. size_t globalsize[] = {256, 256} ;
  67. clEnqueueNDRangeKernel(ocl.getCommandQueue(), kernel, 2, NULL, globalsize, NULL, 0, NULL, NULL);
  68. clFinish(ocl.getCommandQueue());
  69. }

我们创建一个宽高都为256的image对象,然后其值设置为当前宽高坐标的大者。同时数据格式为CL_UNORM_INT8,然后使用不同的坐标去读取image对象的值。其结果显示如下:

  1. (float2)(0.0, 0.0) read:0.000000
  2. (float2)(0.0, 1.0) read:0.500000
  3. (float2)(0.0, 1.5) read:1.000000
  4. (float2)(0.0, 2.0) read:1.500000
  5. (float2)(1.5, 1.5) read:1.000000
  6. (float2)(0.5, 2.0) read:1.500000
  7. (float2)(0.5, 2.5) read:2.000000
  8. (float2)(1.0, 1.0) read:0.750000
  9. (float2)(254.0, 254.0) read:253.750000
  10. (float2)(255.0, 255.0) read:254.750000
  11. (float2)(255.5, 255.5) read:255.000000
  12. (float2)(256.0, 256.0) read:255.000000
  13. (float2)(300, 300.0) read:255.000000
  14. (int2)(1, 1) read:1.000000
  15. (int2)(0, 0) read:0.000000
  16. (int2)(1, 2) read:2.000000
  17. (int2)(254, 254) read:254.000000
  18. (int2)(255, 255) read:255.000000
  19. (int2)(256, 256) read:255.000000
  20. (int2)(257, 257) read:255.000000

从上面的结果我们可以看出得知如下信息:

  1. 如果读取的时候使用的是float2坐标,假设为坐标为(w, h),那么,其返回的值为(w - 0.5, h - 0.5)处的插值结果,插值的方式为我们常规意义,或者在CPU代码中对该图像进行双线性插值。当然这也和采样器sampler_t对象设置为CLK_FILTER_LINEAR有关。如果其设置为CLK_FILTER_NEAREST,那么肯定就是为最近邻插值了。举例来说,对于(float2)(1.0, 1.0)坐标,其插值目标为(1.0 - 0.5, 1.0 - 0.5),位于(0,0), (0, 1), (1, 0), (1,1)四个像素点中间,根据双线性插值计算。其结果即为0.75
  2. 如果读取的时候使用的是int2坐标,那么其坐标与值的关系就和CPU中处理该image一样。

OpenCL中读取image时的坐标的更多相关文章

  1. f-stack中ipc传递指针从应用中读取信息时挂掉

    f-stack中ipc传递指针从应用中读取信息时挂掉 如:创建bridge0./ifconfig bridge0 create./ifconfig f-stack-0 down./ifconfig f ...

  2. 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots

    读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots   以下为异常详细信息: Exception in thread &q ...

  3. C#读取Excel表中的数据时,为何有些行的字段内容读取不到

    转载:http://bbs.csdn.net/topics/360220285 1.当某列数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数 ...

  4. 在往oracle中插数据时,如何处理excel读取的时间空值

    //若从excel中读取的时间值为空值时,做如下转换 string YDKGSJ = string.Empty; if (dbdata.Rows[i]["约定开工时间"].ToSt ...

  5. Flink从Kafka 0.8中读取多个Topic时的问题

    Flink提供了FlinkKafkaConsumer08,使用Kafka的High-level接口,从Kafka中读取指定Topic的数据,如果要从多个Topic读取数据,可以如下操作: 1.appl ...

  6. 使用Flink时从Kafka中读取Array[Byte]类型的Schema

    使用Flink时,如果从Kafka中读取输入流,默认提供的是String类型的Schema: val myConsumer = new FlinkKafkaConsumer08[String](&qu ...

  7. Java中读取txt文件中中文字符时,出现乱码的解决办法

    这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...

  8. 在Linux中,当需要从磁盘读取块时,进程状态会发生什么变化?被封锁了吗?如果是这样,如何选择另一个流程来执行?

    当某个进程需要从磁盘中获取数据时,它实际上会停止在CPU上运行以让其他进程运行,因为该操作可能需要很长时间才能完成-至少需要5ms的磁盘寻道时间,而5ms就是1000万从程序的角度来看,CPU周期是永 ...

  9. 【转载】opencl中设备内存

    地址空间限定符 一般的内核代码中,里面的内核参数或声明变量时,都会有地址空间限定符 地址空间限定符,地址空间限定符的主要作用是指出数据应该保存在哪个地方 地址空间限定符有4个: 全局内存: 限定符:_ ...

随机推荐

  1. springboot开发之使用外部servlet容器及对jsp的支持

    一般而言,springboot是使用自己内嵌的servlet容器,比如tomcat等等,而且默认的模板引擎是thymeleaf,那么如何让springboot使用外部的servlet容器并支持对jsp ...

  2. 利用http协议使用普通的网站虚拟主机+安信可A6C GPRS模块实现对stm32的远程升级

    步骤: 1.生成bin文件并将bin文件放到虚拟主机目录内 2.做一个php的页面分块读取该bin文件,以asc字符echo出来,并标记好头尾长度和校验. 3.GPRS协议栈连接主机路径,收到内容,将 ...

  3. Shell与进程

    查看当前运行的进程 名称: ps 使用权限: 所有使用者 使用方式: ps [options] [--help] 说明: 显示瞬间行程 (process) 的动态 参数: ps的参数非常多, 在此仅列 ...

  4. Flink 1.10 正式发布!——与Blink集成完成,集成Hive,K8S

    Apache Flink社区宣布Flink 1.10.0正式发布! 本次Release版本修复1.2K个问题,对Flink作业的整体性能和稳定性做了重大改进,同时增加了对K8S,Python的支持. ...

  5. mplayer命令行模式下的使用方法【转】

    mplayer命令行模式下的使用方法http://hi.baidu.com/lovehack2006/blog/item/162ef9778214111eb051b9d4.htmlMPlayerMPl ...

  6. 通过欧拉计划学Rust编程(第54题)

    由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾. 刷完欧拉计划中的63道基础题,能学会Rust编程吗? "欧拉计划"的网址: https ...

  7. Java并发读书笔记:Lock与ReentrantLock

    Lock位于java.util.concurrent.locks包下,是一种线程同步机制,就像synchronized块一样.但是,Lock比synchronized块更灵活.更复杂. 话不多说,我们 ...

  8. yukongDSRM账户安全防护

    一.DSRM简介 1.DSRM(Diretcory Service Restore Mode,目录服务恢复模式)是windows域环境中域控制器的安全模式启动选项.域控制器的本地管理员账户也就是DSR ...

  9. 14-SSM整合

    今日知识 1. Spring整合MyBatis 2. SSM普通整合 3. SSM整合(Spring和SpringMVC分离) 4. 纯JavaConfig的SSM Spring整合MyBatis 1 ...

  10. CSS选择器世界

    CSS选择器世界 CSS选择器的分类与优先级 css选择器分为四类:选择器.选择符(后代关系的空格.>.+.~.||).伪类.伪元素(::before.::after.::first-lette ...