首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将X字节或位从__m128i复制到标准内存

将X字节或位从__m128i复制到标准内存可以通过以下步骤实现:

  1. 创建一个指向__m128i类型的变量,用于存储要复制的数据。
  2. 使用适当的方法或函数将数据加载到__m128i变量中。这可以通过直接赋值、使用加载指令(如_mm_load_si128)或其他适当的方法来完成。
  3. 创建一个指向目标内存的指针,用于存储复制后的数据。
  4. 使用适当的方法或函数将__m128i变量中的数据复制到目标内存中。这可以通过直接赋值、使用存储指令(如_mm_store_si128)或其他适当的方法来完成。

以下是一个示例代码,演示了如何将X字节或位从__m128i复制到标准内存:

代码语言:txt
复制
#include <emmintrin.h>

void copyData(__m128i source, void* destination, size_t size) {
    // 创建一个指向目标内存的指针
    char* destPtr = static_cast<char*>(destination);

    // 将数据从__m128i复制到目标内存
    for (size_t i = 0; i < size; ++i) {
        destPtr[i] = reinterpret_cast<char*>(&source)[i];
    }
}

int main() {
    __m128i data = _mm_set_epi32(4, 3, 2, 1); // 示例数据

    // 复制数据到标准内存
    char destination[16]; // 目标内存
    copyData(data, destination, sizeof(destination));

    // 打印复制后的数据
    for (size_t i = 0; i < sizeof(destination); ++i) {
        printf("%d ", destination[i]);
    }

    return 0;
}

在这个示例中,我们使用了SSE指令集中的_mm_set_epi32函数创建了一个示例数据__m128i变量。然后,我们使用copyData函数将数据从__m128i复制到标准内存中。最后,我们打印了复制后的数据。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行适当的修改和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

第十二章:向量指令 第一部分

图 2:SSE2(a)和 ARM NEON(b)中的内嵌函数名称 表 1:x86 内嵌函数的数据类型指定 内嵌函数数据类型的名称(如__m128i 和其他)和函数已经成为不同编译器中的事实上的标准。...相比之下,_mm_storeu_si128(__m128i* addr, __m128i a)指令寄存器 a 中复制 128 长的连续数据数组到 RAM, addr 地址开始。..._mm_storel_epi64(__m128i* addr, __m128i a)指令具有相反的效果, addr 地址开始将寄存器的最低有效 64 复制到 RAM 中。..._mm_cvtsi128_si32(__m128i a)指令则相反,将寄存器的最低有效 32 复制到一个整数变量中。..._mm_alignr_epi8(__m128i a, _m128i b, int imm)指令选定的字节 imm 开始,将源寄存器b的字节复制到目标寄存器,并从最低有效字节开始,寄存器 a 复制其余部分

15010

第十三章 向量指令 第二部分:矢量化

因此,图像被存储为字节数组无符号16整数变量。代码特意简化了:所有示例中的图像块都是正方形的,大小分别为4、816像素。每个函数都使用特定大小和像素深度的块。...例1:src复制到dst template void copy_mb(const uint8_t * src, uint8_t * dst,...与示例5相比,向量化实现变得更加复杂,因为dst值必须8转换为有符号无符号的16值。还需要实现反向转换为带有上限和下限的无符号8值。...行长度通常不会是4、816字节的倍数。...没有指令RAM中加载任意数量的字节。最简单的解决方法是不向量化这段代码,如例9和13所示。在下面的示例中,“尾部”永远不会超过15字节,并且对于足够大的图像块的性能损失很小。

16510
  • 【AI PC端算法优化】一,一步步优化RGB转灰度图算法

    例如,SSE4向量寄存器(xmm)长度为128,即16个字节,如果操作floatint的数据,可同时操作4个,如果操作char数据,可同时操作16个。...其函数命名可大致分成3个使用_隔开的部分,3个部分的含义如下: 第一个部分为_mm_mm256。_mm表示其为SSE指令,操作的向量长度为64128。..._setr_epi8/epi16/epi32/epi64x 用若干个整形数的转置顺序初始化向量 3.4 内存中加载数据 数据类型 描述 _mm256_load_ps/pd 对齐的内存地址加载浮点向量..._pd/ (2)_mm256_permute4x64_epi64 根据8控制值输入向量中选择64元素 _mm256_permute2f128_ps/pd 基于8控制值两个输入向量中选择128块...如果输入向量包含intfloat,则使用所有控制。对于_mm256_shuffle_ps,前两对位第一个矢量中选择元素,第二对第二个矢量中选择元素。 ?

    1.6K20

    SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。

    _mm_loadu_si128就是把之后16个字节的数据读入到一个SSE寄存器中,注意由于任意位置的图像数据内存地址肯定不可能都满足SIMD16字节对齐的规定,因此这里不是用的_mm_load_si128...而_mm_cvtepu8_epi16指令则把这16个字节的低64的8个字节数扩展为8个16数据,这样做主要是为了上述的乘法进行准备的。...,也就是说他并不会在循环里每次都构造这个数据,而是直接某个内存里读,这也就和我们在外部定义是一个意思了。      ...32的低16,我们这里前面已经明确了成绩的结果是不会超出short类型的,因此,所以只取低16就已经完全保留了所有的信息。      ..._mm_storeu_si128把处理的结果写入到目标内存中,注意,这里会多写了4个字节内存数据(128 - 12 * 8),但是我们后面又会把他们重新覆盖掉,但是有一点要注意,就是如果是最后一行数据

    1.3K80

    SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24图像时间由480ms降低到30ms)。

    这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助。...闲话少说, SIMD指令集,这个古老的东西,第一代开始算起,也快有近20年的历史了,最开始的MMX技术,到SSE,以及后来的SSE2、SSE3、SSE4、AVX以及11年以后的AVX2,逐渐的成熟和丰富...free(RowCopy); return IM_STATUS_OK; }   代码很短,但是这段代码很经典,第一,这个代码支持In-Place操作,也就是Src和Dest可以是同一块内存...我也是找了半天都没有找到问题所在,后来一步一步的测试,最终问题定位在16转换为32整形那里去了。...通常,我们都是对像素的字节数据进行向上扩展,他们都是正数,所以用unpack之类的配合zero把高8高16的数据填充为0就可以了,但是在本例中,GX16或者GY16很有可能是负数,而负数的最高位是符号

    2.3K90

    SSE图像算法优化系列2-高斯滤波

    编程实现来看,这个拷贝是没有必要的,所以1b可以写成: ?...4) { __m128i SrcV = _mm_shuffle_epi8(_mm_loadu_si128((const __m128i*)LinePS), Mask); __m128i...8的8个字节数据并将它们转换为8个16进制数保存到Src16L和Src16H中,而_mm_unpacklo_epi16/_mm_unpackhi_epi16则进一步把16数据扩展到32整形数据,最后通过...,采用了_mm_malloc分配了16字节对齐的内存,而Data每行元素的个数又是4的倍数,因此每行起始位置处的内存也是16字节对齐的,所以字节_mm_store_ps是可行的。...最后,ConvertBGRAF2BGR8U的SSE的代码,这一段要进行SSE优化的难度确实是蛮大的,我实现的瓶颈在于我不知道如何将SSE向量映射为只保存3个值的一个像素,这里我还需要再继续探索下去,我先给一份我的普通实现

    1.1K20

    小波去噪算法的简易实现及其扩展(小波锐化、高斯拉普拉斯金字塔去噪及锐化)之二。

    ,因此,如果使用浮点,占用的内存要比字节版本的大四倍,而且和层数有着密切的关系。...我们知道,字节版本的模糊可以获得很高的计算效率,这个场景的模糊是否可以使用呢,我个人分析认为,这个版本的算法已经不适合用字节版本的模糊了,原因主要是精度太低了,因为他每次的结果都和上一次的模糊相关,而我们通过...,则尽量用16表达。...理论上说,这种填充技术要比前面的分配一整片的内存内存填充工作量大3倍左右,速度应该要慢一些,优点是占用的中间内存少一些,但是实测,还是这种的速度快一些,或许是因为三行内存的大小有效,访问时的cache...__m128i P3 = _mm_loadu_si128((__m128i *)(Second + X)); __m128i P4 = _mm_loadu_si128((__m128i

    1.2K40

    统计内存数据中二进制1的个数(SSE指令集优化版).

    169 算法因为最后有一个mod取余操作,速度要稍微慢一点,256元素的查表算法速度要次之,当然,其实要建议那个256元素的表不要使用int类型,而是使用unsigned char类型的,尽量减少表的内存占用量...具体的来首,就是我们加载16个字节数据,然后和0xF进行and操作,得到每个字节的低4,然后进行shuffle,得到每个字节低4的二进制中1的个数,然后在把原始字节数右移4,再和0xF进行and操作...,得到每个字节的高4,然后进行shuffle,两次shuffle的结果相加,就得到了这16个字节数据的二进制中1的个数。...((__m128i*)(Array + Y)); Value = _mm_add_epi32(_mm_and_si128(Value, _mm_set1_epi32(0x55555555...= UsedV.m128i_u32[0] + UsedV.m128i_u32[1] + UsedV.m128i_u32[2] + UsedV.m128i_u32[3];   这里唯一要注意的就是最后UsedV

    11910

    SSE图像算法优化系列七:基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法。

    在数据尾部(右侧),情况有所不同,我们应该H中取值。      ...关于转置,一直也是个耗时的过程,但是我在图像转置的SSE优化(支持8、24、32),提速4-6倍 一文中提到了利用SSE实现高速的转置操作,利用它去实现本文的流程则非常靠谱。   ...= 4)) return IM_STATUS_INVALIDPARAMETER; // 节省内存的角度考虑,可以只需要两倍额外的内存 unsigned...+ X), _mm_max_epu8(_mm_loadu_si128((__m128i *)(LinePG + X)), _mm_loadu_si128((__m128i *)(LinePH + X)...进一步的分析: 由上面的代码可以看到,要实现整个的过程,我们需要原图3倍大小的额外内存,那么是否有降低这个的可能性呢,是有的,在处理列方向时,我们可以一次性只处理16列32列,这样g/h数据只各需要

    1.8K90

    实现目前最快的半径相关类算法(附核心源码)

    如何将两者搭桥呢,仔细想想确实很简单,如果是求最大值(膨胀),那么只要局部有一个像素为255,结果就为255,此时的局部均值必然大于0 (考虑实际因素,应该是局部累加值,因为考虑最后的整除,不排除某个局部区域...如此一来,我们会发现,这种实现过程相比标准的方框模糊来说还少了一些步骤,我们先贴下我SSE优化方框模糊的核心部分: 1 int BlockSize = 4, Block = (Width - 1) /...((__m128i *)(ColValue + X - 1)); 7 __m128i ColValueIn = _mm_loadu_si128((__m128i *)(ColValue + X...我也构思过不实用累加和的方式判断,比如使用运算或者与运算,但是都是解决不了进出像素的处理问题,因此,整体看来是还是用累加最为科学。   ...而在SSE里,这种类型转换还不需要强制进行,因为他直接操作内存。   我们贴下下面的代码可能有人就能明白是什么意思了。

    1.1K30

    SSE图像算法优化系列四:图像转置的SSE优化(支持8、24、32),提速4-6倍

    有了上面的32的转置,对灰度模式的转置基本思路也是定位在各种pack和unpack的组合了,因为SSE支持一次性读取16个字节的数据,所以最原始的想法也是写个16*16小块的灰度转置函数,但是由于灰度数据一个像素就是一个字节...(3)、 BGR24的SSE实现       24我们在PC上最常遇到的格式(手机上倒是基本不用),是最难以用SSE处理的,一个像素3个字节是的以4为基本需求的一些SIMD函数难以发挥勇武之地,除了一些和像素成分无关的算法...对于转置,由于一个像素占用3个字节,如果完全按照转置的严格意义对24图像使用各种unpack来得到结果,不是说做不到,但是将变得异常复杂,耗时耗力,并且不一定有加速作用,我这里提出的方案是借用32的来处理...我们也是一次性进行4*4的图像块的转置,首先还是读取16个字节的信息,这里就包括了5个多的24像素的像素值,我们只取前4个,并将它们扩展为4个BGRA的格式,A值填充任何数据都可,然后使用32的转置算法...,转置得到32的结果,在将结果转换到4个24像素信息,由于这中间只是借用了XMM寄存器或者一级或者二级缓存作为保存数据的地址,没有用到普通的中间内存,因此效率也非常之高。

    1.9K100

    SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现)。

    类似于高斯模糊或者StackBlur,算法也是属于行列分离的,行方向上,先用上述方式左向右计算,然后在从右向左,接着进行列方向处理,先从上向下,然后在从下向上。当然,行列的计算也可以反过来。..._epi32将低32的整形数的4个字节直接扩展到XMM的4个32中去。...__m128i Buf1 = _mm_loadu_si128((__m128i *)(Buffer + X + 0)); __m128i Buf2 = _mm_loadu_si128((__m128i...但是对于24怎么办呢,他的计算过程是3个字节重复的,无法直接利用SIMD的这种优化的方式的,同高斯模糊算法的全面优化过程分享(一) 一文类似,我们也是可以把24的图像补一个Alpha通道然后再转换到...最难的是灰度图,因为灰度图的计算过程是单字节重复的,正如上述代码所示,24补一的代价是多1个元素的计算,但是SIMD能一次性计算4个整形的算法,因此还是很划算的,如果灰度也这样玩,SIMD的提速和浪费的计算句完全抵消了

    1.2K100

    图像纹理合成及纹理传输算法学习(附源码)。

    水平和垂直部分具有重叠   要达到合成自然,在有了第一个块之后,其周边的块应该原图中选择和其最相似的部位, 因此 ,我们已经合成的块中抽取部分重叠的数据,如上图所示,红色方框内,没有红色网格线的部分即为重叠的内容...指令,不需要16字节对齐 __m128i v0l = _mm_unpacklo_epi8(v0, vk0); __...m128i v0h = _mm_unpackhi_epi8(v0, vk0); // 此两句的作用是把他们分别加载到两个128寄存器中,供下面的..._mm_madd_epi16的16SSE函数调用(vk0的作用主要是把高8置0) __m128i v1 = _mm_loadu_si128((__m128i...以上计算SSD的方式也可以帮助提高标准的模板匹配算法的速度,这个我想有心的人应该不难实现。

    1.7K80

    【AI PC端算法优化】四,一步步将Sobel边缘检测加速22倍

    ); } } } free(RowCopy); } 这段代码有两个主要特点,一是它支持In-Place操作,也即是说Src和Dest可以是同一块内存;二是,这个代码考虑了边缘Padding...代码中可以看到对于灰度图的优化是没有必要的,因为在计算的时候当前像素只和另外两个像素相关: ?...,并且这些数据有可能会超出字节所能表达的范围,所以就需要用到SSE的抗饱和向下打包指令了: _mm_storel_epi64((__m128i *)(LinePD + X), _mm_packus_epi16...4032x3024 Float->INT+查表法 1000 81.62ms 4032x3024 SSE优化版本1 1000 34.95ms 在上面的代码中还要额外注意一点,通常,我们都是对像素的字节数据进行向上扩展...,他们都是正数,所以用unpack之类的配合zero把高8高16的数据填充为0就可以了,但是在本例中,GX16或者GY16很有可能是负数,而负数的最高位是符号,如果都填充为0,则变为正数了,明显改变原始的数据了

    1.5K11

    【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。

    再后续还有一个线性化内存,算了,我已经没看那个了,到前面这一步就已经打止了,因为我已经开始编程了。    ...Height - Y : T); J++) { // 高度方向依次向下进行T次运算 for (int X = 0; X < Block...// 这个读取和写入是没有重叠的,所以可以不利用中间内存 _mm_storeu_si128((__m128i *)(LinePD + X), Value);...lsb4[Y] = Src[Y] & 15; msb4[Y] = (Src[Y] & 240) >> 4;   比如这样就可以: // 无符号字节数据右移四 inline __m128i...我从这个代码里最大的收获不是其他的,就是_mm_shuffle_epi8这个语句,利用这个很巧妙的实现了一个查找表的过程,其实我想起来了,在我的博文【算法随记七】巧用SIMD指令实现急速的字节流按反转算法

    1.3K11

    H264H265 NALU 起始码搜索性能优化(1)

    在ffmpeg中,在进行h264 rbsp流demux的时候,需要进行starting code的搜索,其采用的方法比较简单,就是不断比较字节流中连续的三个字节,是不是 0x00, 0x00,...按照ffmpeg的算法,搜索一个内存块中的所有H264 NALU的起始码,并将起始码的位置写入nalu_borders数组中,写出来的代码如下,整个逻辑简单明了: vector split_simd_ffmpeg...本算法利用了64的寄存器预先读取8个字节,然后在循环提内通过掩码与操作进行比对,一个循环中对8个字节进行264起始码的搜索,相比ffmpeg需要不断内存中load,然后逐字节比对来说,使得搜索性能得到了显著提升...毕竟寄存器的性能远比内存的读写性能要强多了!而且在一个循环里面可以通过编译器和CPU的优化进行指令的多路并发执行。...src = _mm_load_si128((__m128i*)(video_data+index)); __m128i mask = _mm_load_si128((__m128i*

    8710

    SSE图像算法优化

    编程优化的角度考虑,我们没有必要完整的对上一级进行高斯模糊,而只需要进行偶数行和偶数列的计算,然后赋值到下一层数据中,而进一步考虑上述矩阵的特殊性,可以通过减少重复计算以及合并相同系数项等手段来优化。...Sum2[X] * 6 + Sum4[X] + 127) >> 8; }   这里的Sum是16的,LinePD是8的。...Block * BlockSize + Channel; X += BlockSize) { __m128i S0 = _mm_loadu_si128((__m128i *)(Sum0 + X...*)(Sum2 + X)); __m128i S3 = _mm_loadu_si128((__m128i *)(Sum3 + X)); __m128i S4 = _mm_loadu_si128...也很简单,我们使用_mm_loadu_si128一次性加载16个字节,然后每隔一个像素就置0,这样就相当于把剩下的8个像素的值直接变为了16数据了,一举两得。

    1K20

    【算法随记七】巧用SIMD指令实现急速的字节流按反转算法。

    字节反转算法,在有些算法加密或者一些特殊的场合有着较为重要的应用,其速度也是一个非常关键的应用,比如一个byte变量a = 3,其二进制表示为00000011,进行按反转后的结果即为11000000...还有一种常用的应用是int型变量按反转,其基本的原理和字节反转类似,本文仅以字节反转为例来比较这个算法的实现。   ...在 c语言实现bit反转的最佳算法-msb-lsb到lsb-msb一文的回复一栏中,我无意看到ytfhwfnh的回复如下:    我觉得查表法不错,但是表太大了,建议改为半字节为单元的查表。...) { /* 获取当前字节,高4 */ u_char ucTmp = (ucBits[i] >> 4) & 0x0F; /* 查表得反转的半字节...那么仔细的观察上面的代码,除了查表之外,其他的计算太容易用SSE相应的指令实现了,计算,并计算,注意移位计算SSE指令的_mm_srli_si128 、_mm_slli_si128并不是按位移位的,他是按照字节进行的移位

    1.2K20
    领券