OpenCL中读取image时的坐标
本文测试OpenCL中读取image数据时关于坐标的两个问题:
- 使用float2坐标读取
- 使用int2坐标读取
首先完整的测试代码如下,测试平台为SDM855:
#include <CL/cl.h>
#include <iostream>
#include <vector>
#include <math.h>
#include "OCL/OPPOOpenCLWrapper.h"
#include "OCL/OCLUtils.h"
#ifndef uchar
#define uchar unsigned char
#endif
const char code[] = R"(
const sampler_t samp1 = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_LINEAR;
__kernel void readtest(read_only image2d_t src, global uchar *dst)
{
int2 coord = (int2)(get_global_id(0), get_global_id(1));
if(coord.x == 0 && coord.y == 0){
printf("(float2)(0.0, 0.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 0.0) ).x * 255.0);
printf("(float2)(0.0, 1.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 1.0) ).x * 255.0);
printf("(float2)(0.0, 1.5) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 1.5) ).x * 255.0);
printf("(float2)(0.0, 2.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 2.0) ).x * 255.0);
printf("(float2)(1.5, 1.5) read:%f \n", read_imagef(src, samp1, (float2)(1.5, 1.5) ).x * 255.0);
printf("(float2)(0.5, 2.0) read:%f \n", read_imagef(src, samp1, (float2)(0.5, 2.0) ).x * 255.0);
printf("(float2)(0.5, 2.5) read:%f \n", read_imagef(src, samp1, (float2)(0.5, 2.5) ).x * 255.0);
printf("(float2)(1.0, 1.0) read:%f \n", read_imagef(src, samp1, (float2)(1.0, 1.0) ).x * 255.0);
printf("(float2)(254.0, 254.0) read:%f \n", read_imagef(src, samp1, (float2)(254.0, 254.0) ).x * 255.0);
printf("(float2)(255.0, 255.0) read:%f \n", read_imagef(src, samp1, (float2)(255.0, 255.0) ).x * 255.0);
printf("(float2)(255.5, 255.5) read:%f \n", read_imagef(src, samp1, (float2)(255.5, 255.5) ).x * 255.0);
printf("(float2)(256.0, 256.0) read:%f \n", read_imagef(src, samp1, (float2)(256.0, 256.0) ).x * 255.0);
printf("(float2)(300, 300.0) read:%f \n", read_imagef(src, samp1, (float2)(300.0, 300.0) ).x * 255.0);
printf("(int2)(1, 1) read:%f \n", read_imagef(src, samp1, (int2)(1, 1) ).x * 255.0);
printf("(int2)(0, 0) read:%f \n", read_imagef(src, samp1, (int2)(0, 0) ).x * 255.0);
printf("(int2)(1, 2) read:%f \n", read_imagef(src, samp1, (int2)(1, 2) ).x * 255.0);
printf("(int2)(254, 254) read:%f \n", read_imagef(src, samp1, (int2)(254, 254) ).x * 255.0);
printf("(int2)(255, 255) read:%f \n", read_imagef(src, samp1, (int2)(255, 255) ).x * 255.0);
printf("(int2)(256, 256) read:%f \n", read_imagef(src, samp1, (int2)(256, 256) ).x * 255.0);
printf("(int2)(257, 257) read:%f \n", read_imagef(src, samp1, (int2)(257, 257) ).x * 255.0);
}
}
)";
void testsamp05()
{
OPPOOpenCLWrapper ocl;
cl_image_format imageformat;
imageformat.image_channel_data_type = CL_UNORM_INT8;
imageformat.image_channel_order = CL_R;
cl_image_desc imagedesc;
memset(&imagedesc, 0, sizeof(imagedesc));
imagedesc.image_width = 256;
imagedesc.image_height = 256;
imagedesc.image_type = CL_MEM_OBJECT_IMAGE2D;
std::vector<uchar> data(256*256, 0);
for(int i = 0; i < 256; ++i){
for(int w = 0; w < 256; ++w){
data[i*256+w] = std::max(i, w);
}
}
cl_int err;
cl_mem src = clCreateImage(ocl.getContext(), CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, &imageformat, &imagedesc, data.data(), &err);
checkErr(err, "src");
cl_mem dst = clCreateBuffer(ocl.getContext(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, 256*256, NULL, &err);
checkErr(err, "dst");
const char *pcode = code;
cl_program prog = ocl.makeProgram(&pcode, sizeof(code) / sizeof(code[0]));
cl_kernel kernel = ocl.makeKernel(prog, "readtest");
clSetKernelArg(kernel , 0, sizeof(src), &src);
clSetKernelArg(kernel , 1, sizeof(dst), &dst);
size_t globalsize[] = {256, 256} ;
clEnqueueNDRangeKernel(ocl.getCommandQueue(), kernel, 2, NULL, globalsize, NULL, 0, NULL, NULL);
clFinish(ocl.getCommandQueue());
}
我们创建一个宽高都为256的image对象,然后其值设置为当前宽高坐标的大者。同时数据格式为CL_UNORM_INT8
,然后使用不同的坐标去读取image对象的值。其结果显示如下:
(float2)(0.0, 0.0) read:0.000000
(float2)(0.0, 1.0) read:0.500000
(float2)(0.0, 1.5) read:1.000000
(float2)(0.0, 2.0) read:1.500000
(float2)(1.5, 1.5) read:1.000000
(float2)(0.5, 2.0) read:1.500000
(float2)(0.5, 2.5) read:2.000000
(float2)(1.0, 1.0) read:0.750000
(float2)(254.0, 254.0) read:253.750000
(float2)(255.0, 255.0) read:254.750000
(float2)(255.5, 255.5) read:255.000000
(float2)(256.0, 256.0) read:255.000000
(float2)(300, 300.0) read:255.000000
(int2)(1, 1) read:1.000000
(int2)(0, 0) read:0.000000
(int2)(1, 2) read:2.000000
(int2)(254, 254) read:254.000000
(int2)(255, 255) read:255.000000
(int2)(256, 256) read:255.000000
(int2)(257, 257) read:255.000000
从上面的结果我们可以看出得知如下信息:
- 如果读取的时候使用的是
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 - 如果读取的时候使用的是
int2
坐标,那么其坐标与值的关系就和CPU中处理该image一样。
OpenCL中读取image时的坐标的更多相关文章
- f-stack中ipc传递指针从应用中读取信息时挂掉
f-stack中ipc传递指针从应用中读取信息时挂掉 如:创建bridge0./ifconfig bridge0 create./ifconfig f-stack-0 down./ifconfig f ...
- 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots
读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots 以下为异常详细信息: Exception in thread &q ...
- C#读取Excel表中的数据时,为何有些行的字段内容读取不到
转载:http://bbs.csdn.net/topics/360220285 1.当某列数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数 ...
- 在往oracle中插数据时,如何处理excel读取的时间空值
//若从excel中读取的时间值为空值时,做如下转换 string YDKGSJ = string.Empty; if (dbdata.Rows[i]["约定开工时间"].ToSt ...
- Flink从Kafka 0.8中读取多个Topic时的问题
Flink提供了FlinkKafkaConsumer08,使用Kafka的High-level接口,从Kafka中读取指定Topic的数据,如果要从多个Topic读取数据,可以如下操作: 1.appl ...
- 使用Flink时从Kafka中读取Array[Byte]类型的Schema
使用Flink时,如果从Kafka中读取输入流,默认提供的是String类型的Schema: val myConsumer = new FlinkKafkaConsumer08[String](&qu ...
- Java中读取txt文件中中文字符时,出现乱码的解决办法
这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...
- 在Linux中,当需要从磁盘读取块时,进程状态会发生什么变化?被封锁了吗?如果是这样,如何选择另一个流程来执行?
当某个进程需要从磁盘中获取数据时,它实际上会停止在CPU上运行以让其他进程运行,因为该操作可能需要很长时间才能完成-至少需要5ms的磁盘寻道时间,而5ms就是1000万从程序的角度来看,CPU周期是永 ...
- 【转载】opencl中设备内存
地址空间限定符 一般的内核代码中,里面的内核参数或声明变量时,都会有地址空间限定符 地址空间限定符,地址空间限定符的主要作用是指出数据应该保存在哪个地方 地址空间限定符有4个: 全局内存: 限定符:_ ...
随机推荐
- go--->beego框架安装
beego 安装 1.新建gopath 工程目录 2.在新建的工程目录中执行go get github.com/astaxie/beego 命令 3.再执行go get github.com/beeg ...
- HanLP《自然语言处理入门》笔记--1.新手上路
1. 新手上路 自然语言处理(Natural Language Processing,NLP)是一门融合了计算机科学.人工智能及语言学的交叉学科,它们的关系如下图所示.这门学科研究的是如何通过机器学习 ...
- 异常处理 | manual close is not allowed over a Spring managed SqlSession
背景: 今天启动一个老项目,控制台打印出以下异常,大概是说在Spring托管的SqlSession上不允许手动关闭: java.lang.UnsupportedOperationException: ...
- Linux如何运行和停止jar包
nohup Java -jar xxxxxx.jar & //意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行 ctrl + c 退出控制面板,系统不停止 查看当前应用所占用端口: ...
- Node.js实战--资源压缩与zlib模块
Blog:<NodeJS模块研究 - zlib> Github:https://github.com/dongyuanxin/blog nodejs 的 zlib 模块提供了资源压缩功能. ...
- 验证码,java
这几天打算写一个验证码出来 遇到了几个问题 imageio写入失败:原因我创建文件的时候是先建立一个text文本,然后修改后缀,图片写不进去,还有没有编译 图像扭曲:粘连的问题,目前解决图像扭曲的问题 ...
- ARTS Week 6
Dec 2, 2019 ~ Dec 8, 2019 Algorithm 从本周开始,由于要涉及某一算法,但我又有选择困难症.所以我决定在Leetcode刷题的,用ARTS中的算法部分来记录本周值得记录 ...
- PyTorch可视化——tensorboard、visdom
一.pytorch与tensorboard结合使用 Tensorboard Tensorboard一般都是作为tf的可视化工具,与tf深度集成,它能够展现tf的网络计算图,绘制图像生成的定量指标图以及 ...
- ODBC连接数据库实例
2012-12-13 22:27 (分类:默认分类) 1.首先建立数据源,正常情况下载控制面板-管理工具-数据源,打开后有用户DSN系统DSN 两者区别在于系统级的DSN,就是对该系统的所有登录用户可 ...
- 搭建Samba服务器、多部门共享,互不干扰,超实用
案例二 实现不同的用户访问同一个共享目录具有不同的权限,便于管理和维护.基本上能满足一些企业用户的需求. 一. 需求 1. 某公司有3个大部门,分别为:人事行政部(HR).财务部(FM).技术支持部( ...