- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 x64/sse 上使用矢量指令计算 x % M 的最佳/最快方法是什么? (% 我的意思是模数/余数)。
我找不到 packed mod 的任何操作码,所以我认为我能做的最好的事情是将 int 提升为 float,然后使用 DIVPS 和 ROUNDPS 计算 x - m * floor(x/m)。
或者是否有我缺少的更好的选择?
更新:M 仅在运行时已知,实际循环如下所示:
unsigned x[SIZE], M[SIZE], answer[SIZE];
for (int i = 0; i < SIZE; i++) {
answer[i] = x[i] % M[i];
}
此外,M 的范围为 1 - 640000000,如果它有任何帮助的话。
最佳答案
如果 M
是一个编译时常量或在循环中是常量,那么您可以 calculated a reciprocal and then do multiplication and a shift 而不是使用除法.我们可以写
x/M = (x*(2^n/M))>>n
因子 2^n/M
(又名 magic number)应该在循环之前或编译时计算。
例如,如果我们想要 x[i]/5
并且我们知道 x[i]
小于 2^15
我们可以使用 2^n/M = 0xCCCD
和 n = 18
。
#include <stdio.h>
#define N 32768
int x[N], y[N], z[N];
int main(void) {
for(int i=0; i<N; i++) x[i] = i;
int M = 5;
int fact = 0xCCCD;
int n = 18;
for(int i=0; i<N; i++) {
y[i] = x[i]/M;
z[i] = (fact*x[i])>>n;
if(y[i] != z[i]) printf("%d %d\n", y[i], z[i]);
}
}
有几种不同的方法可以确定魔数(Magic Number)和n
。我用 Agner Fog's Vector Class Library(VCL) .它会为您使用 SSE2 或 AVX2 处理 32 位数字(而不是上面代码中的 15 位数字)。如果您想查看汇编代码来执行此操作,请访问他的 assembly library也为 SSE2(也许还有 AVX2)这样做
有关详细信息,请参阅 VCL 手册的第 22 页。在他的汇编库的手册中也有描述。
关于assembly - 如何使用 SSE 计算模数/余数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27560819/
整数除法 / 和取模 % 运算在编程中经常一起使用,有时甚至在相同的操作数和后续行中使用。例如,下面的 C 函数是一个简单的函数,它将 2 个数字的 / 的结果与其 % 的结果相加,就是这样做的: i
我在我应该修复的程序中发现了一个函数,该函数的 mod函数定义: int mod(int a, int b) { int i = a%b; if(i 2 17 % -3 -> 2 -1
找出能被 1 到 N 的所有数整除且不留余数的最小数。由于数字可能非常大,我们将答案取模 1000000007。 我认为能被从 1 到 N 的所有数字整除的最小数字是 LCM(1..N)。 示例:对于
昨天我完成了 Chris Pine 的“学习编程”一书中的练习 (9.5)。它是老式罗马数字转换器的整数。 我是这样做的: def old_roman_numeral number roman
在 x64/sse 上使用矢量指令计算 x % M 的最佳/最快方法是什么? (% 我的意思是模数/余数)。 我找不到 packed mod 的任何操作码,所以我认为我能做的最好的事情是将 int 提
在 C# 中,是否有 C99/IEEE 754 的 remainder() 的完全等价物?功能? C# language specification says operator %(double x,
我刚看完 this topic (尤其是最后的评论)。 然后我想知道,为什么我们实际上需要这是给出余数。但似乎之前“在谷歌”上的人并不多...... 最佳答案 如果你正在寻找你想要它的原因,一个是所谓
我试图记住数学是如何计算出来的,以计算循环冗余检查中 XOR 算法的剩余部分,以验证网络消息的剩余位。 我不应该扔掉那本教科书。 这在代码中很容易完成,但是如何手工完成呢? 我知道它看起来有点像标准除
我为此做了很多搜索,但仍然不够幸运。 我知道默认情况下,Crystal Reports 中的 MOD/REMAINDER 函数适用于整数。 小数除以整数的余数有什么出路? 示例:2.454 mod 1
我为此做了很多搜索,但仍然不够幸运。 我知道默认情况下,Crystal Reports 中的 MOD/REMAINDER 函数适用于整数。 小数除以整数的余数有什么出路? 示例:2.454 mod 1
尝试将 rowCounter 除以 2 时如何在 ASP.NET Razor 中执行此操作?我收到红色下划线语法错误,提示“无法将类型‘long’隐式转换为‘bool’ long rowCounter
我试图使用 emu8086 工具将 (Unsigned) 8A32F4D5 除以 C9A5。我预计商为 AF73H,余数为 94B6H。编写以下代码后,我得到了正确的商,但余数变成了 0000h。我错
我试图使用 emu8086 工具将 (Unsigned) 8A32F4D5 除以 C9A5。我预计商为 AF73H,余数为 94B6H。编写以下代码后,我得到了正确的商,但余数变成了 0000h。我错
阅读@anton的答案在这个link我试着看看 remainder(x, y) 是否真的是 x-(round(x/y)*y)。 针对 x=5. 和 y=2. 的值运行代码。我得到了: printf("
我是一名优秀的程序员,十分优秀!