intrinsics相关内容

C++ SSE 内部函数:将结果存储在变量中

我无法理解使用 SSE 内在函数将某些 SIMD 计算的结果存储回“正常变量".例如,_mm_store_ps 内在函数在“英特尔内在函数指南"中的描述如下: void _mm_store_ps (float* mem_addr, __m128 a) Store 128-bits(由4个压缩单精度(32-bit)组成)浮点元素)从 a 进入内存.mem_addr 必须对齐在 16 字节 ..
发布时间:2021-08-27 19:48:04 C/C++开发

我需要在 2021 年使用 _mm256_zeroupper 吗?

摘自 Agner Fog 的“用 C++ 优化软件": 在某些 Intel 上混合使用和不使用 AVX 支持编译的代码时出现问题处理器.从 AVX 代码到非 AVX 代码会导致性能下降因为 YMM 寄存器状态发生了变化.应该通过调用来避免这种惩罚从 AVX 代码到非 AVX 代码的任何转换之前的内在函数 _mm256_zeroupper().在以下情况下,这可能是必要的: • 如果程序 ..
发布时间:2021-08-27 19:47:05 C/C++开发

尝试专门使用内在函数_mm256_storeu_pd()时出现分段错误

似乎自己通过在mm256调用中强制转换cij2指针进行了修复 所以_mm256_storeu_pd((double *)cij2,vecC); 我不知道为什么这会改变任何东西... 我正在编写一些代码,并尝试利用Intel手动矢量化技术.但是每当我运行代码时,在尝试使用我的双* cij2时都会遇到分段错误. if(q == 0){__m256d vecA;__m256d ve ..
发布时间:2021-05-16 19:51:58 其他开发

XCode和_bittest函数

我有一个为Win32开发的C ++项目,我想将其移植到OSX.该代码使用了 _bittest 和 _bittest64 之类的函数,但在XCode头文件中找不到相同的函数. 这些功能的替代方案是什么?可能有工作良好的polyfill.该项目确实是一个遗产,目前不需要任何额外的性能. 解决方案 ..
发布时间:2021-05-16 19:51:53 C/C++开发

有可能制作自定义的renderscript内部函数吗?

Renderscript内在函数非常快速且有用.但是,在某些情况下,我们可能希望构建自己的内在函数,例如当前的卷积不支持Matlab中的“有效"模式.拥有它会很好.因此,我想知道是否可以这样做并与java层很好地连接(就像现有的内部函数一样)?如果可能的话,您会草图吗?谢谢. 解决方案 否,目前无法添加自定义内在函数.在下一个版本中,我们计划以与自4.3以来裁剪内核运行相同的方式来添加对裁 ..
发布时间:2021-05-16 19:51:48 其他开发

AVX512-如何将所有设置的位右移?

如何将屏蔽寄存器的所有设置位向右移动?(到最下面的最低位置). 例如: __ mmask16 mask = _mm512_cmpeq_epi32_mask(vload,vlimit);//掩码= 1101110111011101 如果将所有设置的位右移,则会得到: 1101110111011101->0000111111111111 如何有效地做到这一点? 下面您可以看到 ..
发布时间:2021-05-16 19:51:45 其他开发

了解`_mm_prefetch`

答案什么是_mm_prefetch()本地化提示?详细介绍了提示的含义. 我的问题是:我想要吗? 我正在研究一个被数十亿次重复调用的函数,其中带有一些 int 参数.我要做的第一件事是使用该参数(低32位)作为4GB缓存的键来查找某些缓存的值.基于调用此函数的算法,我知道大多数情况下该键会从一次调用翻倍(左移1位),所以我在做: int foo(int key){uint8_t值= ..
发布时间:2021-05-16 19:51:38 C/C++开发

如何将单精度浮点数的XMM寄存器转换为整数?

我在XMM寄存器中有一堆打包的浮点数(使用SSE内在函数): __ m128 xmm = _mm_set_ps(4.0f,3.0f,2.0f,1.0f); 我想一次将所有这些转换为整数.我发现了一个内在函数,它可以满足我的要求( _mm_cvtps_pi16()),但是它会生成4x16位的 short 而不是成熟的 int .名为 _mm_cvtps_pi32()的内部函数会产生 int ..
发布时间:2021-05-16 19:51:35 C/C++开发

如何取消设置N个最右边的设置位

有一个相对知名的技巧可以取消设置一个最右边的位: y = x&(x-1)//0b001011100&0b001011011 = 0b001011000 :) 我发现自己有一个死循环来清除n个最右边的位,但是有没有更简单的代数技巧? 假定相对较大的n(对于64位整数,n必须小于64,但通常约为20-30). //x = 0b001011100 n = 2对于(auto i = 0; ..
发布时间:2021-05-16 19:51:31 其他开发

使用SSE的矩阵向量和矩阵矩阵乘法

我需要编写矩阵向量和矩阵矩阵乘法函数,但是我不能将头放在SSE命令周围. 矩阵和向量的维数始终是4的倍数. 我设法编写了矢量-矢量乘法函数,如下所示: void vector_multiplication_SSE(float * m,float * n,float *结果,无符号const int大小){我__declspec(align(16))__ m128 * p_m =(_ ..

当写入2个缓存行的一部分时,为什么在Skylake-Xeon上`_mm_stream_si128`要比`_mm_storeu_si128`慢得多?但是对Haswell的影响较小

我有类似以下的代码(简单的加载,修改,存储)(我已对其进行了简化以使其更具可读性): __ asm__ __volatile__("vzeroupper":::);尽管(...) {__m128i in = _mm_loadu_si128(inptr);__m128i out = in;//实际代码的作用远不止于此,但我已经对其进行了简化_mm_stream_si12(outptr,out); ..
发布时间:2021-05-16 19:18:52 其他开发

LLVM:无法选择:内部%llvm.spu.si.sf

我收到此错误 >铛-std = c99 -c导数.c -o导数.a致命错误:后端错误:无法选择:内部%llvm.spu.si.sf 当我尝试使用Clang编译这个简单的C程序 #include#include整数N = 100;双H = 0.001;双PI = 3.14159265;无效派生(double *输入,long元素,double *输出) ..
发布时间:2021-04-22 18:42:05 其他开发

真值表归结为三元逻辑运算,vpternlog

我有很多包含多个变量的真值表(7个或更多),并且使用一种工具(例如,逻辑星期五1)简化逻辑公式.我可以手工完成,但这太容易出错了.然后,我将这些公式转换为编译器固有函数(例如, _mm_xor_epi32 )可以正常工作. 问题:使用 vpternlog ,我可以进行三元逻辑运算.但是我不知道有一种方法可以将我的真值表简化为(某种程度上)有效的vpternlog指令序列. 我并不是要问 ..
发布时间:2021-04-15 20:40:10 其他开发

用于平铺矩阵乘法的AVX内在函数

我试图使用AVX512内部函数对矩阵乘法(平铺)的循环进行矢量化处理.我使用__mm256d作为变量来存储中间结果并将其存储在我的结果中.但是,这会以某种方式触发内存损坏.我没有暗示为什么会这样,因为非AVX版本可以正常工作.另外,另一个怪异的事情是,磁贴大小现在会以某种方式影响结果. 矩阵结构附在下面的代码部分中.该函数使用两个矩阵指针m1和m2以及tileSize的整数.感谢@harol ..
发布时间:2021-04-12 20:55:21 C/C++开发