<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zyl910的专栏]]></title><description><![CDATA[优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。主力博客：http://www.cnblogs.com/zyl910/]]></description><link>https://blog.csdn.net/zyl910</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; zyl910]]></copyright><item><title><![CDATA[[C#] 使用 .NET 的跨平台SIMD硬件加速功能，将 GEMM（通用矩阵乘法）算法速度提升1080倍，比肩 MKL、OpenBLAS]]></title><link>https://blog.csdn.net/zyl910/article/details/151049634</link><guid>https://blog.csdn.net/zyl910/article/details/151049634</guid><author>zyl910</author><pubDate>Tue, 02 Sep 2025 00:44:55 +0800</pubDate><description><![CDATA[GEMM（General Matrix Multiply，通用矩阵乘法）是科学计算与深度学习等领域的核心算法。
以前用 C# 开发的GEMM程序的性能，比MKL、OpenBLAS差得远，这是因为那时的 .NET 不支持SIMD硬件加速技术。从2014年开始， .NET 对SIMD硬件加速技术的支持越来越完善了。我潜心研究用该技术来改进 C# GEMM程序的性能，最近有了重大突破——对于1024尺寸矩阵的SGEMM，我的算法比基础算法的性能提升1080倍，与 MKL、OpenBLAS的测试结果在同一梯队。]]></description><category></category></item><item><title><![CDATA[发布 ExSpans v1.0, 它突破了32位索引的限制, 提供了 nint 索引范围Span类型；并能使内存映射文件支持 Span操作]]></title><link>https://blog.csdn.net/zyl910/article/details/148679080</link><guid>https://blog.csdn.net/zyl910/article/details/148679080</guid><author>zyl910</author><pubDate>Mon, 16 Jun 2025 01:07:47 +0800</pubDate><description><![CDATA[Span是 C# 7.2 引入的一种新结构, 允许开发者以类型安全的方式访问任意内存的连续区域。它既可以用于托管内存（如数组）, 又可以用于非托管内存（如通过 `Marshal.AllocHGlobal` 分配的内存）, 并且不需要进行内存复制, 从而提高性能. 
但 Span 存在一个缺点, 它使用的是 int (Int32: 32位整数) 类型的索引. 即使是在 64位操作系统中, 它仅能访问最长 2G(`2^31`) 的数据. 而 `Marshal.AllocHGlobal` 方法在分配内存时支持 n]]></description><category></category></item><item><title><![CDATA[[C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法-第2部分：使用YShuffleX2Kernel优化程序]]></title><link>https://blog.csdn.net/zyl910/article/details/146298725</link><guid>https://blog.csdn.net/zyl910/article/details/146298725</guid><author>zyl910</author><pubDate>Sun, 16 Mar 2025 18:18:20 +0800</pubDate><description><![CDATA[在本主题的 上一篇文章 里，给大家讲解了24位图像水平翻转(FlipX)算法。但该文章主要是为了介绍 YShuffleX3Kernel 的使用，该算法性能并不是最优的。于是本文将介绍如何使用 YShuffleX2Kernel 来优化程序。而且Imageshop在留言区给了一份C语言的、基于Sse系列指令集实现的代码，正好一起对比一下。]]></description><category></category></item><item><title><![CDATA[发布 VectorTraits v3.1（支持 .NET 9.0，支持 原生AOT）]]></title><link>https://blog.csdn.net/zyl910/article/details/145373548</link><guid>https://blog.csdn.net/zyl910/article/details/145373548</guid><author>zyl910</author><pubDate>Mon, 27 Jan 2025 00:35:38 +0800</pubDate><description><![CDATA[VectorTraits已更新至 v3.1版。支持 .NET 9.0，支持 原生AOT。]]></description><category></category></item><item><title><![CDATA[[C#] 复数乘法的跨平台SIMD硬件加速向量算法（不仅支持X86的Sse、Avx、Avx512，还支持Arm的AdvSimd）]]></title><link>https://blog.csdn.net/zyl910/article/details/144780105</link><guid>https://blog.csdn.net/zyl910/article/details/144780105</guid><author>zyl910</author><pubDate>Sat, 28 Dec 2024 01:05:00 +0800</pubDate><description><![CDATA[将复数乘法改造为SIMD向量算法，是稍微有一些的难度的。首个难点是需要重新调整元素的位置，才能满足复数乘法公式。而“调整元素的位置”与内存中数据布局有关，不同办法的性能不同。还需考虑优化内存访问等细节。
最近知乎有个帖子讨论了该话题，且 hez2010 给出了修正后的基于Avx指令集 HorizontalAdd（水平加法）的向量算法。
于是我来说说基于 Shuffle（换位）的向量算法吧。且这些算法是跨平台的]]></description><category></category></item><item><title><![CDATA[[C#] 24位图像水平翻转的跨平台SIMD硬件加速向量算法的关键——YShuffleX3Kernel源码解读（如Avx2解决shuffle的跨lane问题、Avx512优化等）]]></title><link>https://blog.csdn.net/zyl910/article/details/144412142</link><guid>https://blog.csdn.net/zyl910/article/details/144412142</guid><author>zyl910</author><pubDate>Wed, 11 Dec 2024 22:58:44 +0800</pubDate><description><![CDATA[在上一篇文章里，给大家讲解了24位图像水平翻转(FlipX)算法，其中用到了一个关键方法——YShuffleX3Kernel。一些读者对它背后的原理感兴趣——为什么它在跨平台时运行也能获得SIMD硬件加速， 各种向量指令集的情况下具体怎样实现的？于是本文便详细解答一下。]]></description><category></category></item><item><title><![CDATA[[C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法（使用YShuffleX3Kernel）]]></title><link>https://blog.csdn.net/zyl910/article/details/144250965</link><guid>https://blog.csdn.net/zyl910/article/details/144250965</guid><author>zyl910</author><pubDate>Wed, 04 Dec 2024 21:52:12 +0800</pubDate><description><![CDATA[在上一篇文章里，给大家讲解了32位图像水平翻转(FlipX)算法，于是本文来探讨更加复杂的24位图像水平翻转算法。
本文除了会给出标量算法外，还会给出向量算法。且这些算法是跨平台的，同一份源代码，能在 X86（Sse、Avx等指令集）及Arm（AdvSimd等指令集）等架构上运行，且均享有SIMD硬件加速。]]></description><category></category></item><item><title><![CDATA[[C#] 对32位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法（使用VectorTraits的YShuffleKernel方法来解决Shuffle的缺点）]]></title><link>https://blog.csdn.net/zyl910/article/details/144176261</link><guid>https://blog.csdn.net/zyl910/article/details/144176261</guid><author>zyl910</author><pubDate>Sun, 01 Dec 2024 22:24:41 +0800</pubDate><description><![CDATA[在上一篇文章里，我们讲解了图像的垂直翻转(FlipY)算法，于是本文来探讨水平翻转(FlipX)。先讲解比较容易的32位图像水平翻转算法，便于后续文章来探讨复杂的24位图像水平翻转算法。
本文除了会给出标量算法外，还会给出向量算法。且这些算法是跨平台的，同一份源代码，能在 X86（Sse、Avx等指令集）及Arm（AdvSimd等指令集）等架构上运行，且均享有SIMD硬件加速。
]]></description><category></category></item><item><title><![CDATA[[C#] 对图像进行垂直翻转(FlipY)的跨平台SIMD硬件加速向量算法，兼谈并行处理收益极少的原因]]></title><link>https://blog.csdn.net/zyl910/article/details/144148892</link><guid>https://blog.csdn.net/zyl910/article/details/144148892</guid><author>zyl910</author><pubDate>Sat, 30 Nov 2024 03:19:06 +0800</pubDate><description><![CDATA[将位图进行水平翻转或垂直翻转，这些是图像处理的常用算法。本文介绍最简单的垂直翻转，便于后续文章来探讨复杂的水平翻转算法。
本文除了会给出标量算法外，还会给出向量算法。且这些算法是跨平台的，同一份源代码，能在 X86及Arm架构上运行，且均享有SIMD硬件加速。]]></description><category></category></item><item><title><![CDATA[[C#] Bgr24彩色位图转为灰度的Bgr24位图的跨平台SIMD硬件加速向量算法]]></title><link>https://blog.csdn.net/zyl910/article/details/143928924</link><guid>https://blog.csdn.net/zyl910/article/details/143928924</guid><author>zyl910</author><pubDate>Thu, 21 Nov 2024 00:42:22 +0800</pubDate><description><![CDATA[在上一篇文章里，我们讲解了“Bgr24彩色位图转为Gray8灰度位图”算法。本文将探讨“Bgr24彩色位图转为灰度的Bgr24位图”。区别在于目标位图也是Bgr24格式的，只是将像素数据由彩色转为了灰度。这些算法也是跨平台的，同一份源代码，能在 X86及Arm架构上运行，且均享有SIMD硬件加速。
]]></description><category></category></item><item><title><![CDATA[[C#] Bgr24彩色位图转为Gray8灰度位图的跨平台SIMD硬件加速向量算法（第2版: 增加512位向量算法、RGB2Y算法的测试对比）]]></title><link>https://blog.csdn.net/zyl910/article/details/143897971</link><guid>https://blog.csdn.net/zyl910/article/details/143897971</guid><author>zyl910</author><pubDate>Tue, 19 Nov 2024 23:16:12 +0800</pubDate><description><![CDATA[将彩色位图转为灰度位图，是图像处理的常用算法。本文将介绍 Bgr24彩色位图转为Gray8灰度位图的算法，除了会给出标量算法外，还会给出向量算法。且这些算法是跨平台的，同一份源代码，能在 X86及Arm架构上运行，且均享有SIMD硬件加速。]]></description><category></category></item><item><title><![CDATA[发布 VectorTraits v3.0（支持 X86架构的Avx512系列指令集，支持 Wasm架构及PackedSimd指令集等）]]></title><link>https://blog.csdn.net/zyl910/article/details/143652257</link><guid>https://blog.csdn.net/zyl910/article/details/143652257</guid><author>zyl910</author><pubDate>Sat, 09 Nov 2024 22:18:34 +0800</pubDate><description><![CDATA[VectorTraits已更新至 v3.0版。支持Vector512类型及 X86架构的Avx512系列指令集; 支持 Wasm架构及PackedSimd指令集; 还提供了 多向量换位（YShuffleX2、YShuffleX3）、交织(Group2Zip, Group2Unzip) 等原创的向量方法。]]></description><category></category></item><item><title><![CDATA[[译] .NET 8 中的硬件内在函数（支持 Wasm 和 AVX-512）]]></title><link>https://blog.csdn.net/zyl910/article/details/137726906</link><guid>https://blog.csdn.net/zyl910/article/details/137726906</guid><author>zyl910</author><pubDate>Sat, 13 Apr 2024 22:25:28 +0800</pubDate><description><![CDATA[它带来了沿着的大量新指令和硬件功能，包括支持16个额外的SIMD寄存器，专用掩码，以及一次操作512位数据。因此，可以利用此新功能的用户数量较少，但它可以为硬件带来的改进仍然很重要，并且值得支持数据繁重的工作负载。这允许暴露的API表面显著更小（减少超过3000个API），现有代码在很大程度上“只是工作”并利用较新的硬件支持而无需显式操作，并且希望支持AVX-512的用户不必学习新概念或以新方式编写代码。，简称Wasm，本质上是在浏览器中运行的代码，它允许比典型的解释型脚本支持更高的性能配置文件。]]></description><category></category></item><item><title><![CDATA[[C#] .NET8增加了Arm架构的多寄存器的查表函数（VectorTableLookup/VectorTableLookupExtension）]]></title><link>https://blog.csdn.net/zyl910/article/details/136977342</link><guid>https://blog.csdn.net/zyl910/article/details/136977342</guid><author>zyl910</author><pubDate>Sat, 23 Mar 2024 22:56:56 +0800</pubDate><description><![CDATA[发现.NET8增加了Arm架构的多寄存器的查表函数（VectorTableLookup/VectorTableLookupExtension），这给编写SIMD向量化算法带来了方便。]]></description><category></category></item><item><title><![CDATA[发布 VectorTraits v2.0（支持 x86的Sse系列指令集等）]]></title><link>https://blog.csdn.net/zyl910/article/details/136786128</link><guid>https://blog.csdn.net/zyl910/article/details/136786128</guid><author>zyl910</author><pubDate>Sun, 17 Mar 2024 17:47:15 +0800</pubDate><description><![CDATA[固定长度的数组”的原理比较简单，就是利用值类型的结构体的一些特点。且2.0版增加了浮点类型判断等多个函数，若仍然放在BitMath里，会使该类便的更大，不易维护。即原本1条指令就能寻址，但JIT只会编译为3条指令的，影响了性能。对于固定长度的向量类型（Vector128/Vector256），在v1.0版时只是提供了常用的向量方法。的地址计算，存在写法繁琐，很难利用“寄存器相对寻址”、“相对基址变址寻址”指令问题。当使用这2种相对寻址时，能在同一指令内就能完成“地址计算”与实际的“数据搬运”。]]></description><category></category></item><item><title><![CDATA[发布 VectorTraits v1.0，它是 C# 下增强SIMD向量运算的类库]]></title><link>https://blog.csdn.net/zyl910/article/details/132749295</link><guid>https://blog.csdn.net/zyl910/article/details/132749295</guid><author>zyl910</author><pubDate>Fri, 08 Sep 2023 00:32:53 +0800</pubDate><description><![CDATA[本库为向量类型提供了许多重要的算术方法(如 Shift, Shuffle, NarrowSaturate)及常数, 使您能更方便的编写跨平台的SIMD运算代码。它充分利用了 X86、Arm架构的内在函数实现硬件加速，且能够享受内联编译优化。]]></description><category></category></item><item><title><![CDATA[[C] 跨平台使用TCHAR——让Linux等平台也支持tchar.h，解决跨平台时的格式控制字符问题，多国语言的同时显示（兼容vc/gcc/bcb，支持Windows/Linux/Mac）]]></title><link>https://blog.csdn.net/zyl910/article/details/8515235</link><guid>https://blog.csdn.net/zyl910/article/details/8515235</guid><author>zyl910</author><pubDate>Thu, 17 Jan 2013 21:50:34 +0800</pubDate><description><![CDATA[作者：zyl910
　　将Windows程序移植到Linux等平台时，经常会遇到tchar.h问题与字符串的格式控制字符问题（char串、wchar_t串、TCHAR串混合输出）。本文探讨如何解决这些问题。

一、背景
1.1 历史
　　传统的C程序使用char字符串，采用ANSI+DBCS方案来支持当地语言，不能实现多国语言同时显示。
　　当年微软在设计Windows NT时考虑到国]]></description><category></category></item><item><title><![CDATA[[C] 跨平台使用Intrinsic函数范例3——使用MMX、SSE2指令集 处理 32位整数数组求和]]></title><link>https://blog.csdn.net/zyl910/article/details/8116970</link><guid>https://blog.csdn.net/zyl910/article/details/8116970</guid><author>zyl910</author><pubDate>Fri, 26 Oct 2012 21:23:44 +0800</pubDate><description><![CDATA[作者：zyl910。
　　本文面对对SSE等SIMD指令集有一定基础的读者，以32位整数数组求和为例演示了如何跨平台使用MMX、SSE2指令集。支持vc、gcc编译器，在Windows、Linux、Mac这三大平台上成功运行。
 
一、关键讲解
　　前文（http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html）演]]></description><category></category></item><item><title><![CDATA[[C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和]]></title><link>https://blog.csdn.net/zyl910/article/details/8116560</link><guid>https://blog.csdn.net/zyl910/article/details/8116560</guid><author>zyl910</author><pubDate>Fri, 26 Oct 2012 18:06:18 +0800</pubDate><description><![CDATA[作者：zyl910。
　　本文面对对SSE等SIMD指令集有一定基础的读者，以双精度浮点数组求和为例演示了如何跨平台使用SSE2、AVX指令集。支持vc、gcc编译器，在Windows、Linux、Mac这三大平台上成功运行。

一、关键讲解
　　前文（http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html）演示]]></description><category></category></item><item><title><![CDATA[[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和（支持vc、gcc，兼容Windows、Linux、Mac）]]></title><link>https://blog.csdn.net/zyl910/article/details/8100744</link><guid>https://blog.csdn.net/zyl910/article/details/8100744</guid><author>zyl910</author><pubDate>Mon, 22 Oct 2012 22:28:17 +0800</pubDate><description><![CDATA[作者：zyl910。
　　本文面对对SSE等SIMD指令集有一定基础的读者，以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个模块，可以完全避免手工编写汇编代码，具有很高可移植性。支持vc、gcc编译器，在Windows、Linux、Mac这三大平台上成功运行。

一、问题背景
　　最初，我们只能使用汇编语言来编写SI]]></description><category></category></item></channel></rss>