相关疑难解决方法(0)

为什么GCC在实现整数除法时使用乘以奇数的乘法?

我一直在阅读divmul组装操作,我决定通过在C中编写一个简单的程序来实现它们:

文件分割

#include <stdlib.h>
#include <stdio.h>

int main()
{
    size_t i = 9;
    size_t j = i / 5;
    printf("%zu\n",j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后生成汇编语言代码:

gcc -S division.c -O0 -masm=intel
Run Code Online (Sandbox Code Playgroud)

但是看生成的division.s文件,它不包含任何div操作!相反,它通过位移和魔术数字来做某种黑魔法.这是一个计算代码片段i/5:

mov     rax, QWORD PTR [rbp-16]   ; Move i (=9) to RAX
movabs  rdx, -3689348814741910323 ; Move some magic number to RDX (?)
mul     rdx                       ; Multiply 9 by magic number
mov     rax, rdx                  ; Take only the upper 64 bits of the …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 integer-division

206
推荐指数
4
解决办法
1万
查看次数

什么是uint_fast32_t以及为什么要使用它来代替常规int和uint32_t?

因此,对于其原因typedef:ED原始数据类型是抽象低级别表示,并使其更容易理解(uint64_t而不是long long类型,这是8个字节).

但是,有uint_fast32_t与之相同typedefuint32_t.使用"快速"版本会使程序更快吗?

c c++ types

99
推荐指数
3
解决办法
4万
查看次数

如何用整数变量划分__m256i向量?

我想将AVX2向量除以常数.我访问了这个问题和许多其他页面.看到可能有助于定点运算的东西,我不明白.所以问题在于这种划分是瓶颈.我试过两种方法:

首先,使用AVX指令进行浮动并执行操作:

//outside the bottleneck:
__m256i veci16; // containing some integer numbers (16x16-bit numbers)
__m256 div_v = _mm256_set1_ps(div);

//inside the bottlneck
//some calculations which make veci16
vecps = _mm256_castsi256_ps (veci16);
vecps = _mm256_div_ps (vecps, div_v);
veci16 = _mm256_castps_si256 (vecps);
_mm256_storeu_si256((__m256i *)&output[i][j], veci16);
Run Code Online (Sandbox Code Playgroud)

使用第一种方法,问题是:没有分割经过的时间是5ns,并且经过的时间是大约60ns.

其次,我存储到一个数组并加载它像这样:

int t[16] ;
inline __m256i _mm256_div_epi16 (__m256i a , int b){

    _mm256_store_si256((__m256i *)&t[0] , a);
    t[0]/=b; t[1]/=b; t[2]/=b; t[3]/=b; t[4]/=b; t[5]/=b; t[6]/=b; t[7]/=b;
    t[8]/=b; t[9]/=b; t[10]/=b; t[11]/=b; t[12]/=b; t[13]/=b; t[14]/=b; t[15]/=b;
    return …
Run Code Online (Sandbox Code Playgroud)

optimization x86 simd avx avx2

4
推荐指数
1
解决办法
740
查看次数

标签 统计

c ×2

assembly ×1

avx ×1

avx2 ×1

c++ ×1

gcc ×1

integer-division ×1

optimization ×1

simd ×1

types ×1

x86 ×1

x86-64 ×1