首页
学习
活动
专区
工具
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 复制其余部分

13510

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

因此,图像被存储为字节数组无符号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字节,并且对于足够大的图像块的性能损失很小。

15810
  • 【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.2K80

    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.2K90

    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个值的一个像素,这里我还需要再继续探索下去,我先给一份我的普通实现

    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

    11210

    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

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

    水平和垂直部分具有重叠   要达到合成自然,在有了第一个块之后,其周边的块应该原图中选择和其最相似的部位, 因此 ,我们已经合成的块中抽取部分重叠的数据,如上图所示,红色方框内,没有红色网格线的部分即为重叠的内容...指令,不需要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.6K80

    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

    【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.4K11

    【工程应用五】 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*

    8310

    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

    基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)

    LaplacePyramidD[Y] = LaplacePyramidB[Y]; } return IM_STATUS_OK; }   其中的_mm_absdiff_epu8函数如下所示: // 返回8字节数数据的差的绝对值...算法的流程是标准化的。...char内存保存的)。   ...LinePD[X] = 0;   第二,在SSE优化时,这个特殊性是可以帮上大忙的,主要体现在两个方面,一时如上的Sum计算过程,我们如果直接按照255相加,则8个数会超出8所表达的范围,这样就要转换到...2、对于彩色图像,如果三个通道独立写,则对每个像素,有可能每个通道的高频低频部分会选自不同的来源,这样有可能导致结果出现异常的彩色,一种解决方案是采用高频低频部分的灰度信号作为判断源。

    1.6K10
    领券