找回密码
 欢迎注册
查看: 4010|回复: 6

[擂台] 64位512位除以256位

[复制链接]
发表于 2023-5-18 14:41:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
本帖最后由 l4m2 于 2023-5-18 17:05 编辑

前面把256位乘以256位做到了skylake上32cycle的latency。問512位除以256位,保證商最多256位,能做到多少的latency?

我目前期望120cycle,不知能否達到


提示:求出商的近似高位後,若要求精確餘數來得到精確的商高位,需要等待近似商與除數的積及進位鏈(約10cycle)。如果保留近似商,則可以與下一步近似商的乘法並行。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-22 16:06:54 | 显示全部楼层
512位除以256位,商可能是257位

点评

商的256位通過保證而來。匯編如果EDX大於除數也會崩掉  发表于 2023-5-22 21:41
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-22 16:07:47 | 显示全部楼层
除法存在试商,纠错步骤,汇编做肯定是复杂的,GMP里也是C写的

点评

我還是一樣看cycle,看latency(平均時長),C不C都行  发表于 2023-5-22 21:42
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-5-22 16:53:19 | 显示全部楼层
无心人 发表于 2023-5-22 16:07
除法存在试商,纠错步骤,汇编做肯定是复杂的,GMP里也是C写的

不知道有比GMP还要快很多的吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-5-24 23:04:32 | 显示全部楼层
先寫這麼多
  1. typedef unsigned long long u64;

  2. template<int N>
  3. struct divHelper {
  4.         static void shl(u64* dst, const u64* src, int d) {
  5.                 asm("shldq %1, %%cl, %0": "=r"(dst[N]): "g"(src[N-1]), "0"(src[N]), "c"(d));
  6.         }
  7.         static void div(u64* ret, u64* mod, const u64* dive, const u64* divo) {
  8.                 int cnt;
  9.                 bool zf;
  10.                 asm("bsrq %1, %q0": "=@ccz"(zf), "=r"(cnt): "g"(divo[N-1]));
  11.                 if (zf) return divHelper<N-1>::div(ret, mod, dive, divo);
  12.                 cnt ^= 63;
  13.                 u64 divo2[N];
  14.                 divHelper<N-1>::shl(divo2, divo, cnt);
  15.         }
  16. };

  17. template<>
  18. struct divHelper<0> {
  19.         static void shl(u64* dst, const u64* src, int d) {
  20.                 *dst = *src << d;
  21.         }
  22.         static void div(u64* ret, u64* mod, const u64* dive, const u64* divo) {
  23.                 __builtin_unreachable();
  24.         }
  25. };
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-31 01:05 , Processed in 0.023388 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表