simd相关内容

如何判断内存是否对齐?

我是使用 SSE/SSE2 指令优化代码的新手,直到现在我还没有走多远.据我所知,一个常见的 SSE 优化函数如下所示: void sse_func(const float* const ptr, int len){if(ptr 对齐){为了( ... ){//将循环展开 4 或 2 个元素}为了( ....){//处理剩下的//(非优化代码)}} 别的 {为了( ....){//处理非对齐内存 ..
发布时间:2021-12-20 16:01:46 其他开发

大型数组或列表的 4 桶直方图的微观优化

我有一个特别的问题.我会尽量准确地描述这一点. 我正在做一个非常重要的“微优化".一次运行数天的循环.所以如果我能减少这个循环时间,它需要一半的时间.10 天会减少到只有 5 天等等. 我现在拥有的循环是函数:“testbenchmark1". 我有 4 个索引需要像这样循环增加.但是当从列表中访问索引时,实际上需要一些额外的时间,正如我所注意到的.这就是我想知道是否有其他解决方 ..
发布时间:2021-12-20 16:00:47 C#/.NET

这个 memcpy 实现中缺少什么/次优?

我对编写 memcpy() 作为一种教育练习产生了兴趣.我不会写一篇关于我做了什么和没有想到的论文,但这里是某人的实现: __forceinline//由于大小通常已知,//最无用的代码会被优化掉//如果函数是内联的.void* myMemcpy(char* Dst, const char* Src, size_t Size){无效*开始= Dst;for ( ; Size >= sizeof( ..
发布时间:2021-12-20 15:48:26 其他开发

从 RGB 到 BGRA 的快速矢量化转换

在对之前关于将 RGB 转换为 RGBA 和 ARGB 到 BGR 的一些问题的跟进中,我想使用 SSE 加速 RGB 到 BGRA 的转换.假设是 32 位机器,并且想要使用内部函数.我很难将源缓冲区和目标缓冲区对齐以使用 128 位寄存器,并寻求其他精明的矢量化解决方案. 要向量化的例程如下... void RGB8ToBGRX8(int w, const void *in, voi ..
发布时间:2021-12-19 18:01:58 其他开发

更好的 8x8 字节矩阵转置与 SSE?

我发现这篇文章解释了如何使用 24 次操作转置一个 8x8 字节的矩阵,稍后滚动几下实现转置的代码.但是,这种方法没有利用我们可以阻止将 8x8 转置成四个 4x4 转置的事实,并且每个转置只能在一个 shuffle 指令中完成(这篇文章是参考).所以我想出了这个解决方案: __m128i transpose4x4mask = _mm_set_epi8(15, 11, 7, 3, 14, 10, ..
发布时间:2021-12-19 08:15:29 其他开发

混合 SSE 整数/浮点 SIMD 指令时是否会降低性能

我最近经常以内在函数的形式使用 x86 SIMD 指令 (SSE1234).我发现令人沮丧的是,SSE ISA 有几个简单的指令,这些指令仅适用于浮点数或仅适用于整数,但理论上应该对两者执行相同.例如,float 和 double 向量都有从地址(movhps、movhpd)加载 128 位向量的更高 64 位的指令,但没有这样的整数指令向量. 我的问题: 在整数向量上使用浮点指令时, ..
发布时间:2021-12-18 09:21:47 其他开发

打印一个 __m128i 变量

我正在尝试使用内在函数学习编码,下面是一个可以添加的代码 使用的编译器:icc #include#includeint main(){__m128i a = _mm_set_epi32(1,2,3,4);__m128i b = _mm_set_epi32(1,2,3,4);__m128i c;c = _mm_add_epi32(a,b);printf("%d\n",c[2]);返回0;} ..
发布时间:2021-12-18 08:42:12 其他开发

为什么 gcc 不将 _mm256_loadu_pd 解析为单个 vmovupd?

我正在编写一些 AVX 代码,我需要从可能未对齐的内存中加载.我目前正在加载 4 个 doubles,因此我会使用内在指令 _mm256_loadu_pd;我写的代码是: __m256d d1 = _mm256_loadu_pd(vInOut + i*4); 然后我使用选项 -O3 -mavx -g 进行编译,随后使用 objdump 来获取汇编代码以及带注释的代码和行 (objdump -S ..
发布时间:2021-11-30 11:13:11 其他开发

x86/x64 处理器使用哪些寄存器进行浮点数学运算?

x86/x64 是否使用 SIMD 寄存器进行高精度浮点运算或专用 FP 寄存器? 我的意思是高精度版本,而不是常规的double精度. 解决方案 FPU 堆栈仍然可用并公开 80 位精度算术,正如@EricPostpischil 指出的那样(不确定处理器是否仍然具有完整的逻辑,或者这部分在硬件级别得到了模拟).它以 long double 类型提供给 GCC 中的开发人员.例如,为 ..
发布时间:2021-11-25 07:26:00 C#

'vector long long' 的可用性是什么?

我正在一台旧的 PowerMac G5(一台 Power4 机器)上进行测试.构建失败: $ make...g++ -DNDEBUG -g2 -O3 -mcpu=power4 -maltivec -c ppc-simd.cppppc-crypto.h:36: 错误:在 AltiVec 类型中使用“long long"无效制作:*** [ppc-simd.o] 错误 1 失败的原因是: typ ..
发布时间:2021-11-25 07:17:53 C#

.NET Framework 4.5 是否提供 SSE4/AVX 支持?

我想,我听说过,但不知道在哪里. 更新:我介绍了 JiT 解决方案 看来要来了.(我一个小时前才发现) 这里有几个链接 JIT最后提出.JIT 和 SIMD 即将结婚. 更新到 SIMD 支持 您需要最新版本的 RyuJIT 和 Microsoft SIMD 启用的矢量类型 (Nuget) ..
发布时间:2021-11-24 10:08:30 C#/.NET

SSE 指令添加数组的所有元素

我是 SSE2 指令的新手.我找到了一个指令 _mm_add_epi8 可以添加两个数组元素.但我想要一个可以添加数组所有元素的 SSE 指令. 我试图用这段代码来发展这个概念: #include #include #include void sse(unsigned char* a,unsigned char* b);无效主(){/* 无符号字符 *arr;arr=(unsigned c ..
发布时间:2021-11-18 04:07:01 C/C++开发

aarch64 上未对齐 SIMD 加载/存储的性能

较旧的答案表明 aarch64 支持未对齐的读/写并提到了性能成本,但不清楚答案是否也仅涵盖 ALU 或 SIMD(128 位寄存器)操作. 相对于对齐的 128 位 NEON 加载和存储,未对齐的 128 位 NEON 加载和存储在 aarch64 上慢多少(如果有的话)? 对于未对齐的 SIMD 加载和存储是否有单独的指令(如 SSE2 的情况),或者已知对齐的加载/存储与潜在未对 ..
发布时间:2021-11-17 22:45:09 其他开发

图像处理中的边界检查

我想在处理图像处理中的任何过滤器时注意边界条件.我正在推断边界并创建新边界.例如,我有 4x3 输入: //输入整数图像[4][3] =1 2 3 42 4 6 83 6 9 12//输出int extensionimage[6][5] =1 1 2 3 4 41 1 2 3 4 42 2 4 6 8 83 3 6 9 12 123 3 6 9 12 12 我的代码: #include #i ..
发布时间:2021-11-17 22:41:38 其他开发