基于GPU/CPU的高性能计算
文章平均质量分 70
zenny_chen
GitHub: https://github.com/zenny-chen/
Gitee: https://gitee.com/zenny-chen/
【CPU Dasher X】https://itunes.apple.com/cn/app/cpu-dasherx/id1168527539?l=en&mt=8
《OpenCL异构并行》:https://item.jd.com/11818715.html
《C语言编程魔法书》:https://item.jd.com/12737899067.html
展开
-
基于ARMv5TE架构的软件除法
近来有点悠闲,所以无聊中做了一个基于二进制试商法的无符号整型除法实现。以下函数仅对于ARMv5T架构或更高版本架构的处理器有效。汇编用的是RVCT3.1或更高版本原创 2023-05-10 18:56:10 · 490 阅读 · 0 评论 -
基于Intel处理器的PREFETCH指令的基本使用
以下这个例子很简单,分别有两个双精度浮点类型的二维数组:double[512][1024],共4MB数据,分为512行1024列,每列位8个字节。现在将每对浮点数组的每一行的第一个元素相加,然后将结果存到一个在栈上分配的数组。原创 2023-05-10 17:22:28 · 421 阅读 · 0 评论 -
Linux下使用POSIX Thread作多核多线程并行计算
POSIX线程库根据处理器、操作系统等特性封装了一台线程处理的接口。对于目前基于x86处理器架构的Linux系统来说,它往往会默认地将新创建的一个线程调度到与主线程不同的核中执行,如果这样能更好地平衡负荷的话。原创 2023-05-10 00:45:31 · 248 阅读 · 0 评论 -
ARM处理器架构的Thumb指令集中关于IT指令的使用
在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了 IT 指令,进一步增强了代码的紧凑性。Thumb中有一个比较有意思的指令——IT,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。如果你需要更紧凑的指令,那么使用Thumb结合ThumbEE来做带条件的指令执行还是不错的选择。Thumb本身不具备带条件指令执行的特性。原创 2023-05-09 20:00:20 · 1080 阅读 · 0 评论 -
OpenCL如何获取最小线程并行粒度
由于OpenCL是为各类处理器设备而打造的开发标准的计算语言。因此跟CUDA不太一样的是,其对设备特征查询的项更上层,而没有提供一些更为底层的特征查询。比如,你用OpenCL的设备查询API只能获取最大work group size,但无法获取到最小线程并行粒度(或称为 分支粒度)。原创 2023-05-09 19:47:54 · 934 阅读 · 0 评论 -
通过OpenCL内核代码猜测设备寄存器个数
在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询。而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因此我这边提供一个比较基本的方法来猜测当前计算设备至少能为每个work-item分配多少可用的寄存器。原创 2023-05-09 18:56:27 · 990 阅读 · 0 评论 -
OpenCL如何判定一个work-group的最大Local Memory大小
最近有不少朋友提及到如何能在运行时获悉一个GPU的最大local memory的尺寸。由于OpenCL对各类处理器开放,因此不同处理器所拥有的local memory大小也各不相同。即便是GPU,甚至同一家公司出的GPU,不同的架构,其Local Memory的尺寸也各不相同。一般来说,现在随着制程工艺的不断发展,Local Memory也逐步变大。原创 2023-05-09 18:50:26 · 262 阅读 · 0 评论 -
OpenCL多次循环执行内核的一个简单样例
最近有不少朋友在多次循环执行OpenCL内核程序的时候碰到一些问题。由于对OpenCL初学者而言可能比较普遍,因此我这里给出一个清晰简单的demo来掩饰如何简单又高效地执行循环执行OpenCL内核。原创 2023-05-09 18:45:29 · 1183 阅读 · 0 评论 -
OpenCL使用CL_MEM_USE_HOST_PTR存储器对象属性与存储器映射
随着OpenCL的普及,现在有越来越多的移动设备以及平板、超级本等都支持OpenCL异构计算。而这些设备与桌面计算机、服务器相比而言性能不是占主要因素的,反而能耗更受人关注。因此,这些移动设备上的GPU与CPU基本都是在同一芯片上(SoC),或者GPU就已经成为了处理器的一部分,像Intel Ivy Bridge架构开始的处理器(Intel HD Graphics 4000开始支持OpenCL),AMD APU等。原创 2023-05-09 17:14:10 · 1200 阅读 · 0 评论 -
关于Intel处理器架构中AVX2里Gather特性的说明
在 Intel Haswell 架构里引入了 Gather 特性。它使得CPU可以使用向量索引存储器编址从存储器取非连续的数据元素。这些gather指令引入了一种新的存储器寻址形式,该形式由一个 基地址寄存器(仍然是通用目的寄存器)和通过一个 向量寄存器(XMM 或 YMM)所指定的多个索引构成。数据元素大小支持32位与64位,并且数据类型支持浮点型和整型。原创 2023-05-09 17:02:07 · 1689 阅读 · 0 评论 -
Linux通过AIO进行异步读文件
信号进行捕获文件读完成事件,当然,这里也可以用 SIGIO。命令选项,因为rt库才包含了系统底层的API。其中,上述代码实现中采用 SIGUSR1。另外,在编译链接时必须添加。原创 2023-05-08 23:54:43 · 360 阅读 · 0 评论 -
nVidia GPGPU vs AMD Radeon HD Graphics执行模式对比
大家做高性能计算的朋友,想必对CPU的执行模式已经非常熟悉了吧。当代高级些的CPU一般采用超标量流水线,使得毗邻几条相互独立的指令能够并行执行——这称为指令集并行(ILP,Instruction-Level Parallelism);而像x86引入的SSE(Streaming SIMD Extension)、AVX(Advanced Vector Extension),以及ARM的NEON技术都属于数据级并行(Data-Level Parallelism)。而GPGPU的执行与CPU比起来还是有不少差异的原创 2023-05-08 23:48:58 · 1903 阅读 · 0 评论 -
OpenGL 4.0的Tessellation Shader(细分曲面着色器)
它是由ATI在2001年率先设计出来的。原创 2023-05-08 22:47:37 · 2656 阅读 · 0 评论 -
探究GPU同时做渲染与通用计算的并行性
在10年前,随着CUDA与OpenCL的纷纷出炉,GPGPU也着实热了一把。而现今,不少公司更是将GPGPU作为挖矿、搞机器学习的计算利器。于是乎,有许多言论声称GPU将很快取代CPU!那么现代化的GPGPU是否具有如此强大的威力甚至于能取代CPU呢?本文将会以GPGPU的任务级并行能力来看看这些尖端GPU的性能。原创 2023-04-24 00:19:25 · 1143 阅读 · 0 评论 -
OpenCL与Metal API下如何合理地安排线程组大小
我们玩过OpenCL的朋友都知道,我们可以通过`clGetDeviceInfo`接口来查询当前计算设备的几乎所有属性,包括当前计算单元的个数、最大工作组大小、本地存储器大小等等。但这些属性值都是基于当前计算设备的最大可支持能力,而不是当前内核程序执行上下文。原创 2023-04-23 17:11:41 · 929 阅读 · 0 评论 -
非临时缓存以及访存对计算性能的思考
我们可以看到,WC(Write Combining)存储器类型由于不被映射到Cache,因此访问速度非常慢。但它仍然可以通过大规模并行访问来减少访存消耗的时间。通过上述代码测试例子,我们可以发现,对于WC的存储区域,使用非临时读与一般正常的读对性能在对此区域的每个数据元素只读一次的情况下几乎没啥区别。但如果对其中某个数据元素访问多次的话,那么使用非临时访问模式就要比普通模式强大很多了!原创 2023-04-23 17:09:15 · 103 阅读 · 0 评论 -
介绍与评测Intel HLE与RTM技术
HLE(即Hardware Lock Elision,硬件锁省略)以及 RTM(即Restricted Transactional Memory,受限的事务性存储器)是Intel在x86微架构中所引入的两条指令集系统,它们均属于 TSX(Transactional Synchronization Extensions,事务性同步扩展)指令集扩展。原创 2023-04-23 17:00:41 · 1432 阅读 · 0 评论 -
SPIR-V初窥
SPIR-V着色器被嵌入在模块之中。每个模块可以包含一个或多个着色器。每个着色器具有一个入口点,该入口点具有一个名字和一个着色器类型,着色器类型用于定义当前着色器跑在哪个着色阶段。入口点则是当前着色器开始执行的位置。一个SPIR-V模块伴随着创建信息被传递给Vulkan,然后Vulkan返回表示该模块的一个对象。该模块对象随后可以用于构造一条流水线。原创 2022-06-29 14:17:09 · 3881 阅读 · 0 评论 -
x86-64与arm64对寄存器访问操作的一些特征
本文主要介绍Intel x86-64架构与ARM64架构对通用目的寄存器以及SIMD寄存器的访问操作的情况。比如,哪些寄存器或某些指令对它们低位修改时,高位仍保持不变;而哪些寄存器或某些操作对它们低位修改时,高位会被清零。原创 2021-12-12 05:09:51 · 1784 阅读 · 0 评论 -
关于x86与ARM的状态标志
本博文想着重介绍的是x86与ARM两大处理器架构会有不一样行为的两个标志位——CF和OF,对应于ARM中的C和V两个标志。原创 2021-12-09 16:35:00 · 1621 阅读 · 2 评论 -
x86_64与ARM64的signaling NaN与Quiet NaN,以及浮点数的舍入模式
在我们当前常用的主流桌面级处理器以及移动处理器中都可能会涉及到浮点数的运算。而在计算机中浮点数的表达本身是要遵循IEEE754规范的。在此规范中明确定义了哪些浮点数是规格化的,哪些是非规格化的,哪些属于正负无穷大,哪些又属于我们今天要讨论的非数(NaN)。原创 2021-12-07 05:52:24 · 3814 阅读 · 0 评论 -
关于ARMv8中FMOV指令的8位立即数imm的表示
关于ARMv8在64位模式下的指令 FMOV <Vd>.<T>, #<imm> 或 FMOV <Vd>, #<imm> 指令中,关于后面8位立即数的描述如下:<imm> 是一个带符号的浮点常量,具有3比特的指数位,规格化的4位尾数位,编码为“imm8”,它被表示为abcdefgh。其中a位最高位,表示符号位;bcd为次高位,表示指数;剩余的efgh为尾数位。官方还列出了一个表,描述了这8位立即数能表示的浮点数的绝对值范围:从上表中原创 2021-12-06 01:30:18 · 3032 阅读 · 0 评论 -
x86架构中UCOMISS浮点比较指令所产生的条件码
Intel官方编程指南已经对通用算术比较指令所产生的条件码已经描述得非常详细了,在《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture》中的附录B。各位也可以通过直接搜索 “condition code” 来搜索到相关内容。但是,此文档对浮点数比较所引发的EFLAGS标志位的变化所对应的条件码几乎没怎么描述,因此本博文将详细列出 UCOMISS 指令所对应可用的条件码。UC原创 2021-11-10 01:04:58 · 3793 阅读 · 0 评论 -
Intel x87 FPU的使用基础
Intel x87 FPU专门用于执行标量浮点计算,可以对单精度浮点(32位)、双精度浮点(64位)以及扩展双精度浮点(80位)进行计算,并顺从IEEE754标准。x87 FPU可以工作在32位兼容模式下以及64位模式下,在这两种下,FPU的数据寄存器的个数都一样,只有8个。对x87 FPU的数据寄存器的访问方式与一般的寄存器有所不同,它是栈式访问。你通过 FLD 指令把外部数据搬到x87 FPU的数据寄存器中时,那么x87 FPU会根据所搬数据的长度(32位、64位、80位)将输入数据分别对待为单精度浮原创 2021-10-30 00:39:50 · 3346 阅读 · 0 评论 -
我的GitHub文集
服务器相关云服务器搭建配置以及服务器开发相关客户端编程技术相关如何用Android Studio创建一个C语言项目并学习开发C语言和汇编语言我收藏的Android开发技术文集Android中使用Objective-C加GNUstep如何用Android Studio创建一个C语言项目并学习开发C语言和汇编语言在Android Studio 3.0中使用C语言以及汇...原创 2019-04-18 16:19:43 · 767 阅读 · 0 评论 -
利用OpenGL固定功能流水线绘制球体
绘制半个球体原创 2010-09-24 14:28:00 · 2355 阅读 · 0 评论 -
使用C11的原子操作来实现线性单链表操作
随着多核处理器的逐步普及,各种对于多核多线程并行计算的算法也得到了深入研究。而在高性能并行计算方面,许多处理器引入了原子操作以便同步多核多线程可共享的资源。在多核多线程环境中,要对某一个共享资源进行同步必须用到原子操作,即便是像mutex、semaphore等传统的锁机制也是需要通过原子操作来实现。为了加速对共享资源的访问操作,许多无锁的算法(lock-free或non-blocking)被设计出来,通过消除锁来避免锁带来的系统开销。原创 2016-11-14 16:44:48 · 3496 阅读 · 4 评论 -
R700指令集架构参考手册——第二章:程序组织和状态
R700指令集架构参考手册——第二章:程序组织和状态翻译 2010-12-23 15:03:00 · 1880 阅读 · 0 评论 -
R700指令集架构参考手册——第一章:介绍
R700指令集架构参考手册——第一章:介绍翻译 2010-12-22 13:18:00 · 2002 阅读 · 1 评论 -
利用OpenCL生成球体顶点
<br />利用OpenCL生成球体顶点<br />原创 2010-10-21 05:54:00 · 1935 阅读 · 1 评论 -
Apple A4之NEON技术——颜色混合算法
本人之前在介绍Apple's OpenCL的时候出过一份代码,是用于图像半透明算法的,并且提供了OpenCL版本与x86的SSE版本。 这次,俺将提供ARMv7架构的NEON版本进行对照。通过对比,各位可以清晰地看到ARMv7架构具有比传统的x86拥有更强的计算能力。在处理器拥有相同的流水线特征的情况下,ARMv7能提供更精简,更强大的计算性能。原创 2010-10-06 23:32:00 · 2183 阅读 · 0 评论 -
Apple A4之NEON技术——NEON寄存器架构
Apple A4处理器以及iPhone3GS、iPod Touch3代32GB和64GB版本所使用的三星ARM cortex A-8处理器支持了完整的ARM NEON技术。ARM NEON技术是英国ARM公司在其最新的ARMv7架构中添加的一项128位SIMD技术,能够实现8位到64位不同长度的向量算术逻辑计算。原创 2010-10-06 00:52:00 · 3528 阅读 · 0 评论 -
Apple's OpenCL
OpenCL由Apple公司起草设计,并于2008年6月提交给KHRONOS开放标准组织,并在当年的12月由该组织release了第一版。原创 2010-08-31 00:43:00 · 4096 阅读 · 0 评论 -
一个简单的OpenCL程序
一个基于Mac OS X Snow Leopard的简单OpenCL程序原创 2010-06-25 00:04:00 · 3572 阅读 · 1 评论 -
如何在iPhone/ipad/iPod Touch中使用NEON技术
NEON技术是ARMv7架构中相对于Atom处理器,很有竞争力的一个技术。它支持了非常丰富的128位向量计算,实现了SIMD技术特征。那么我们如何在Apple的iPhone3GS或更高版本;ipod Touch3代或更高版本以及iPad上使用NEON技术呢?原创 2010-07-19 23:17:00 · 2541 阅读 · 0 评论 -
CUDA中使用Intrinsic Function
由于CUDA C/C++的表达方式中没有一些像“计算前导零”以及“位反转”等特殊操作。因此我们可能不得不直接用PTX来处理这些逻辑,这样能一个周期搞定。原创 2010-06-27 18:13:00 · 1991 阅读 · 0 评论 -
偶写的第一个CUDA程序——向量加法
这个CUDA工程包括了三个文件,一个是makefile;一个是vector_add.cu,用于联系主机端与设备端;最后是vector_add_kernel.cu,这个就是设备端要执行的真正的CUDA程序。原创 2010-06-28 00:59:00 · 4013 阅读 · 0 评论 -
R700指令集架构参考手册
R700指令集架构参考手册——前言翻译 2010-12-22 12:07:00 · 1029 阅读 · 1 评论 -
Memory Fence
随着现在多核、众核处理器的兴起,多线程之间的同步问题也是逐步被大家所看中。今天我将介绍一下Memory Fence同步机制。原创 2010-11-02 02:02:00 · 14414 阅读 · 13 评论 -
R700指令集架构参考手册第二章——2.5 程序状态
R700指令集架构参考手册第二章——2.5 程序状态翻译 2010-12-28 23:52:00 · 1798 阅读 · 0 评论