自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(626)
  • 资源 (3)
  • 收藏
  • 关注

原创 cmake:在Makefile中运行ant脚本

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,在Java开发环境中应用非常广泛。 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake,在c/c++跨平台开发中应用非常广泛 。 有的时候,我们

2016-07-05 17:21:44 1558 1

原创 cmake:善用find_package()提高效率暨查找JNI支持

cmake提供了很多实用的cmake-modules,通过find_package()命令调用这些modules,用于写CMakeLists.txt脚本时方便的查找依赖的库或其他编译相关的信息,善用这些modules,可以提高写脚本的效率和脚本通用性。 说起来真的有点太抽象,举个我最近遇到的简单例子吧。 我们写java的JNI接口代码时,肯定是需要jni.h文件的,那么在写cmake脚本中,就需

2016-07-05 15:06:03 5213 1

原创 java:NIO读写文件的示例

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。 NIO方式读数据非常简单 创建一个缓冲区(ByteBuffer);通过一个FileChannel (从FileInputStream 创建)完成缓冲区的数据读入; NIO方式写数据也同样简单 创建一个缓冲区(ByteBuffer);向其中填充数据;然后通过一个Fil

2016-07-04 19:00:54 4865 1

原创 java:File.deleteOnExit()实现分析塈用于多级目录时的讲究

java.io.File对象有个有意思的方法deleteOnExit,这个方法的用途简单说就是要求在java虚拟机结束的时候删除该文件/目录。 删除文件,很好理解,结束的时候这个文件自动被删除,但是对于目录,我们知道,目录是可以层层嵌套的,对于一个有多级子目录的File对象?如何确保使用deleteOnExit被准确删除呢?还是举个栗子吧:package net.facesdk.cas;impo

2016-07-04 18:13:57 3652 1

原创 cmake:环境变量(environment variable)读写和if判断

cmake中对环境变量读写都是通过ENV前缀来访问环境变量 读取环境变量则要使用 $ENV{JAVA_HOME}这样的格式 写环境变量如下:set( ENV{PATH} /home/martink )if语句判断环境变量是否定义要用下面的格式if(NOT DEFINED ENV{JAVA_HOME}) # 没有找到JAVA_HOME环境变量 message(FATAL_ERRO

2016-06-27 17:08:23 45638 1

原创 cmake:EXCLUDE_FROM_ALL的用处

cmake 的add_library,add_executable,add_subdirectory等命令都有一个EXCLUDE_FROM_ALL参数. 这个参数的作用根据cmake官网的解释就是如果某个target或subdirectory被设置为EXCLUDE_FROM_ALL属性,那么这个target(或这个subdirectory中的所有target)就会被排除在all target列表之

2016-06-25 17:09:34 12481

原创 cmake设置msvc的运行库(runtime library)塈指定openjpeg使用静态库

cmake这个跨平台的make工具功能已经很强大了,但它也有不足的地方,就是本文的标题。 在用cmake生成NMake的Makefile或visual studio的.sln时,如何指定运行库(/MD /MT)? 原本,我以为可以在CMAKE的手册中找到一个command或PROPERTY或VARIABLE,简单的调用或设置一下就可以了,很遗憾,把整个CMAKE manual翻了几遍也没找到,没

2016-06-22 17:04:11 7092

原创 nmake(vs2015)命令行编译libjpeg-turbo(x86/amd64)

很久之前写过一篇博客《mingw(gcc)编译libjpeg-turbo》,介绍了windows下用mingw编译libjpeg-turbo的过程。 当时对cmake的使用并不非常熟悉,对msvc的命令行编译也不在行,所以还不会用msvc编译libjpeg_turbo源码,所以只能从暂时libjpeg_turbo的官网(http://libjpeg-turbo.virtualgl.org/)下载...

2016-06-22 11:50:12 6781 3

原创 cmake:设置编译选项的讲究(add_compile_options和CMAKE_CXX_FLAGS的区别)

在cmake脚本中,设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。 使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的: add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),而set命令设置CMAKE_C_FLAGS或CMAKE_CX

2016-06-22 09:53:48 119689

原创 msvc/gcc:中用#pragma指令关闭特定警告(warning)

在使用一些第三方库或源码的时候,经常会遇到编译时产生warnings情况,这些warning不是我们自己的代码产生的,当然也不好去修改,但每次编译都显示一大堆与自己代码无关的警告也着实看着不爽,而且还有可能造成自己代码中产生的警告被淹没在多过的无关警告中,而被忽略掉的情况。 所以要想办法关闭这些第三方代码和库产生的警告。 关闭特定的warning可以在编译时通过命令行参数的方式指定,比如 gcc

2016-06-21 14:03:20 12584 1

原创 msvc交叉编译:使用vcvarsall.bat设置命令行编译环境

一直以来我只知道vc设置命令行编译环境的批处理命令是%VS140COMNTOOLS%/Common7/Tools下的vsvars32.bat,(%VS140COMNTOOLS%为定义vs2015公共工具程序位置的环境变量,命令行窗口输入set就能找到,vs2010的对应定义为%VS100COMNTOOLS%) 微软的官网上有这个命令的说明: https://technet.microsoft.c

2016-06-20 18:06:04 11050

原创 cmake:install制作简单的安装脚本

当我们制作用于二次开发的SDK的时候,用cmake的install命令制作一个安装脚本提供简单的SDK安装功能,在make结束后自动把文件分类放在不同的目录下,提供给用户,比只是把.h,.lib,.dll文件一股脑的复制给用户,让用户自己去配置要好得多。 下面的cmake脚本片段,展示了用cmake install命令实现的简单安装功能:########安装脚本########### 将生成的t

2016-06-19 12:46:47 13328

原创 LNK2019:win32下编写DLL,应用程序找不到DLL接口函数的一种情况

最近项目技术研究结束,开始代码封装,产品最终是以动态库的形式发布,于是开始整理代码,把原来以静态库方式编译的函数库改为动态库编译,动态库编译正常。 然后用编译测试程序(调用动态库的函数)时报错了, 2>test_detect.obj : error LNK2019: 无法解析的外部符号 “_declspec(dllimport) void __cdecl gdface::set_global_

2016-06-14 14:25:16 2154

原创 opencl:异步复制函数的注意事项(async_work_group_copy/async_work_group_strided_copy)

OpenCL中的内置函数async_work_group_copy和async_work_group_strided_copy用于实现全局内存(global memory)和本地内存(local memory)之间的异步数据复制,在某些情况下,使用异步复制(async copy)的方式在全局内存和本地内存之间复制数据比直接赋值的方式要方便。 下面是async_work_group_copy的函数说

2016-06-11 13:21:05 3265 2

原创 基于OpenCL的图像积分图算法改进

简单往要付出代价,这个代价可能很大,在opencl环境下编程,与我们在CPU上的传统编程思想有一些差异,这些差异看似微不足道,但往往细节决定成功,就是这些看似微不足道的差异导致同一种算法在GPU和CPU运行效果有着巨大的差别 之前写过一篇文章《基于OpenCL的图像积分图算法实现》介绍了opencl中积分图算法的基本原理(不了解积分图概念的朋友可以先参考这篇文章),并基于这个基本原理提供了kern

2016-06-08 10:25:01 5120 14

原创 opencl:原子命令实现自旋锁(spinlock)的使用限制

原子命令很重要的用途就是互斥(mutexes)。互斥保证了每次只有一个work-item能访问数据。opencl也支持原子命令,在opencl最初始的版本1.0,原子命令是作为扩展功能(opencl extensions)来提供的(参见cl_khr_global_int32_base_atomics,cl_khr_global_int32_extended_atomics)。到opencl1.2以后

2016-05-29 16:11:10 2494 1

原创 opencl:获取每个计算单元(CU)中处理元件(PE)的数目

OpenCL 平台模型的定义如下图。模型中有一个主机,并且有一个或多个OpenCL 设备与其相连。每个OpenCL 设备可划分成一个或多个计算单元(CU),每个计算单元又可划分 成一个或多个处理元件(PE)。设备上的计算是在处理元件中进行的。 OpenCL 应用程序会按照主机平台的原生模型在这个主机上运行。主机上的OpenCL 应用程 序提交命令(command queue)给设备中的处理元

2016-05-23 11:01:25 7611 1

原创 opencl:c++接口(cl.hpp)利用cl::LocalSpaceArg设置__local 参数

当我们需要在kernel中使用local memory数组的时候,有两种方式定义local 数组 第一种,编译期静态定义,这是比较普通的使用方式,如下代码,这种方式,在编译期就分配了local 数组的大小。#define LOCAL_ARRAY_SIZE 64 // LOCAL_ARRAY_SIZE 可以通过编译选项-D在编译的时候定义__kernel void test_kernel( ){

2016-05-16 16:33:37 2317 1

原创 opencl:提高kernel有效并发约束(Effective concurrency constraint)的一点心得

下面是一个简单的kernel函数,从integ_count_mat矩阵中用vload8函数取出A1,A2,A3,A4四个向量执行A4+A1-A2-A3,结果存入density_mat,代码中只用到了一个向量类型的变量sum。__kernel void object_density_filter( matrix_info_cl im_info , const __

2016-05-09 14:51:17 2935 1

原创 opencl:clEnqueueNDRangeKernel执行报错CL_OUT_OF_RESOURCES的一种情况

我的电脑上之前的显卡比较老并不支持opencl,所以我之前开发时opencl代码其实都是在CPU上跑的,现在所有的代码都调试通过了,决定装块新显卡用于程序的性能测试。 今天显卡到了,装上之后运行程序,clEnqueueNDRangeKernel在执行下面的kernel时报错:CL_OUT_OF_RESOURCES。__kernel void prefix_sum_col_and_transpose

2016-05-03 16:02:00 5382 1

原创 CMake Error: ...Missing variable is: CMAKE_FIND_LIBRARY_

今天在使用cmake的find_library命令时,cmake居然报错: CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. Missing variable is: CMAKE_FIND_LIBRARY_PREFIXES意思就是CMAK

2016-04-29 16:26:26 2827 1

原创 C++11:可变参数模板实现print输出参数

C++11支持可变参数模板的特性,真的是很好用。 下面代码实现的print函数,就利用可变参数模板以及函数模板递归调用,实现将任意多个不同类型的参数顺序输出打印到std::ostream流中。#include /* 终止递归函数 */inline void args_print(std::ostream& steam){}/* 使用可变参数模板实现参数打印到输出流(ost

2016-04-23 15:53:37 4169

原创 opencl:慎用-cl-opt-disable选项编译kernel(可能会导致一些无法解释的问题)

在编译opencl kernel代码时,有一个编译选项-cl-opt-disable。根据opencl 官网的原文描述,使用这个选项可以关闭所有的代码优化,便于调试程序。(默认情况下,编译优化选项是打开的) 参见clBuildProgram 但是今天为了调试kernel代码,实际使用这个选项编译kernel却发现,使用这个选项就是坑。使用之后,kernel参数传递都不正常了。 下面这是个很简单

2016-04-21 15:00:01 2474 1

原创 opencl/msvc:kernel因为指针对齐方式(alignment)造成向量类型(vector data type)读写异常

opencl knernel中对全局内存(__global)向量类型数据的读写有两种方式, 一种是直接用=操作符赋值,一种则是通过vstoren/vloadn函数来实现向量数据读写。 =操作符赋值方式使用简单,但在msvc下以CL_MEM_USE_HOST_PTR模式向kernel传递数据时如果数据对齐方式不对,会造成kernel运行时异常。本文就是针对这种情况分析原因并提出解决方案。

2016-04-19 12:03:55 3106 1

原创 opencl:一个关于向量赋值的异常

在项目中,有一个下面这样的数据结构,storage保存是个float4类型的数组。typedef struct _detected_objects_buffer { cl_float4 storage[MAX_DETECTED_OBJECT_NUM]; cl_int detected_num; kernel_error status;}detected_objects_b

2016-04-17 11:28:17 1925 1

原创 opencl:kernel中两种向量类型转换(convert_T,as_typen)的主要区别

opencl kernel中向量类型转换分为两种方式,explicit conversions和reinterpreting type,中文可以分别直译为"显式转换"和"重新解释类型"。本文讨论这两种类型转换的区别。

2016-04-17 10:53:09 3627 1

原创 C++11:模板实现opencl向量类型(cl_intn,cl_floatn...)的简单运算符(+,-)重载及length,distance函数

opencl内核支持的所有向量数据类型(intn,floatn,doublen….)在主机端都有对应的类型,区别是加了前缀cl_,比如int4对应的主机端类型是cl_int4。 我们知道,在opencl内核代码中,向量类型(vector data type)的数据可以像普通标量类型(scala data type)一样,用各种算术和逻辑运算符进行操作。 比如:int4 p1=int4(4,2,0

2016-04-11 15:10:48 3940 2

原创 C++11模板:如何判断类中是否有指定名称的成员变量?

如何判断类中有指定的成员函数,网上可以找到不少的文章,比如下面这两篇就写得很详细了 《C++11之美》 《C++模板,判断是否存在成员函数,实现差异化操作 》我现在关心的是如何判断一个类中有成员变量?成员变量有可能是数组,也可能是其他的类。 看了上面关于判断成员函数的文章,理解其原理后,判断是否成员变量,也是差不多的道理,实现起来非常简单。

2016-04-10 17:11:16 8620 6

原创 opencl:C++11下使用别名(x,y,z,hi,lo...)访问vector类型(cl_int2,cl_long16...)的元素

在gcc(5.2.0)下使用C++11写opencl的程序时,发现无法像内核代码一样对cl_int2这样的向量(vector)类型用pos.x,pos.y这样的方式来访问向量元素,只能用pos.s[0]这种数组访问的方式。这是为什么?这是platform.h中cl_int2的定义,可以看出,虽然代码中有,x,y名字定义,但编译开关__CL_HAS_ANON_STRUCT__导致这部分代码是灰的

2016-04-10 10:57:12 5339

原创 C++11:MinGW当指定-std=c++11选项时 默认定义了__STRICT_ANSI__

__STRICT_ANSI__的来历__STRICT_ANSI__是gcc编译器的的一个预定义宏,一般来说当使用了-ansi编译选项,就会定义这个宏。 关于__STRICT_ANSI__的来历,参见下面关于gcc编译选项的说明: -ansi 支持符合ANSI标准的C程序. 这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸

2016-04-09 16:31:22 9816 1

原创 Libb64:c/c++实现的base64编码解码库函数

base64编码解码本身也不复杂,但要自己写,还是得花点时间,如果能找到现成的可靠的代码,抄来最好,节省了测试的时间。 libb64就是实现base64编码解码的开源库,还提供了C++封装,用起来也挺方便代码下载地址 https://sourceforge.net/projects/libb64/下面是使用libb64 C++封装接口进行base64编码解码的调用代码/* * b64_wrapp

2016-03-31 12:11:41 8100 1

原创 zlib库内存压缩解压缩函数的C++便利性封装

zlib是提供数据压缩用的函数库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表,普遍为许多软件所使用。 在使用zlib进行内存压缩解压缩的的时候主要用到的函数就是两个compress/uncompress。为了在C++中使用更方便,做一些便利性封装是非常必要的。 下面的代码中主要对zlib的内存压缩和解压缩进行了C++封装,出错以异常抛出。

2016-03-29 17:19:43 6751 2

原创 C++11:for_each_file遍历目录处理文件

经常我们需要对某个目录下的所有文件进行处理,这里我们需要列出目录下的文件,并找出符合要求的文件,然后才开始真正的处理工作。大部分情况下,这个流程都差不多,只是文件处理的内容不同,可不可以做一个类似#include<algorithm>中的for_each一样的函数,来把把这个过程抽象化呢? 基于这个想法,实现了for_each_file函数 代码如下:#include <functional>

2016-03-29 14:42:55 5902 3

原创 windows下MSVC兼容的dirent.h

dirent.h是一个应用程序接口,主要用于文件系统的目录读取操作,主要提供了几个目录数据读取函数,参见opengroup.orgint closedir(DIR *);//关闭目录DIR *opendir(const char *);//打开目录struct dirent *readdir(DIR *);//读取目录int

2016-03-29 13:33:38 10654 4

原创 c++:改造cmdline用于MSVC下的命令行参数解析

cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件,使用起来非常方便,关于如何使用它,不是本文讨论的重点,本文要说的是如何解决cmdline在MSVC下不能编译的问题。

2016-03-25 18:10:09 6576 4

原创 OpenCL: kernel中的向量关系运算符和等价运算符(>,<,>=,<=,==,!=)

opencl的kernel编程语言是C99标准的一个子集,在C99的基础上opencl增加了向量数据类型(Scalar Data Types):charn,ucharn,shortn,ushortn,intn,uintn,longn,ulongn,floatn,doublen(n=2,4,8,16)。 这些向量类型与基础的标量类型(Vector Data Types)一样支持各种算术和逻辑运算符。

2016-03-20 10:51:39 2435

原创 opencl C++接口: 关于CL_KERNEL_FUNCTION_NAME的一个坑

我的项目中所有的kernel在程序初始化时就被编译生成了,存放在一个std::unordered_map类型的map表中(kernel name为key),以后程序需要调用的时候,就通过kernel name来获取指定的cl::Kernel对象。 建这个表的时候,要创建cl::Kernel。常用的创建cl::Kernel的途径有两个:cl::Pro

2016-03-13 12:32:54 2436 1

原创 基于OpenCL的图像积分图算法实现

积分图的概念图像积分图算法在图像特征检测中有着比较广泛的应用,主要用于规则区域特征值的计算。 积分图的概念可用下图表示: 坐标A(x,y)的积分图是其左上角的所有像素之和(图中的阴影部分)。定义为: 在上图中,A(x,y)表示点(x,y)的积分图;s(x,y)表示点(x,y)的y方向的所有原始图像之和。积分图算法在CPU上的串行实现在CPU上串行实现积分图计算的典型代码如下: /*

2016-03-12 16:51:50 3927 2

原创 C++11:如何判断一个类是另一个模板类的子类?

我有一个模板类memory_cl,我需要判断另一个类是否为它的子类,怎么实现呢? 开始我问了度娘,在知乎上找到了答案 —>《如何判断一个类是否为一个模板类的实例?》 上面这个链接中给出了完整的答案:struct is_kind_of_{ template static std::true_type che

2016-03-10 12:45:19 5482

原创 opencl:cl::make_kernel的进化

我之前的一篇博客《opencl:C++ 利用cl::make_kernel简化kernel执行代码》详细说明了如何使用OpenCL C++接口(cl.hpp)提供cl::make_kernel算子来简化kernel执行代码。/* 缩放图像(双线性插值) */gray_matrix_cl gray_matrix_cl::zoom(size_t dst_width, size_t dst_height

2016-03-10 12:18:19 2506 1

CMake脚本在ultraedit中的语法高亮支持

资源来自CMake官网: http://www.cmake.org/Wiki/images/5/56/UltraEditWordfile.tar.gz, 但这个链接已经无法访问,从历史快照中找加,上传备份 参见使用方法参见:https://blog.csdn.net/10km/article/details/52368486

2023-06-08

erpcgen-windows-x86_64.zip

用cygwin编译的erpcgen,可以windows下直接通过IDL编译生成client/server端(C++)代码,有cygwin的童鞋也可以自行编译,很方便的。 erpc git仓位置: https://github.com/EmbeddedRPC/erpc

2020-09-17

windows下MSVC兼容的dirent.h

<dirent.h>是一个应用程序接口,主要用于文件系统的目录读取操作,主要提供了几个目录数据读取函数,<dirent.h>是unix系统下常见的接口,但windows平台的MSVC编译器并没有提供这个接口( Cygwin5 and MingW现在已经提供了dirent接口),对于跨平台的项目开发就会带来一些麻烦,如果在MSVC下编译时可能因为windows平台缺少这个接口就要为windows平台另外写一些代码。本资源是从网上找的,提供了windows下为MSVC实现的dirent.h接口实现,方便跨平台开发和移植。

2016-03-31

libb64--base64编码解码库

libb64是实现base64编码解码的开源库,还提供了C++封装,用起来挺方便

2016-03-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除