hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1070|回复: 4

64位512位除以256位

[复制链接]

604

主题

616

帖子

1951

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1951
发表于 2023-10-15 13:23:26 | 显示全部楼层 |阅读模式
前面把256位乘以256位做到了skylake上32cycle的latency。問512位除以256位,保證商最多256位,能做到多少的latency?

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


提示:求出商的近似高位後,若要求精確餘數來得到精確的商高位,需要等待近似商與除數的積及進位鏈(約10cycle)。如果保留近似商,則可以與下一步近似商的乘法並行。
回复

使用道具 举报

0

主题

177

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2023-10-15 13:24:18 | 显示全部楼层
512位除以256位,商可能是257位
回复

使用道具 举报

0

主题

179

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-10-15 13:24:38 | 显示全部楼层
除法存在试商,纠错步骤,汇编做肯定是复杂的,GMP里也是C写的
回复

使用道具 举报

0

主题

178

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-15 13:25:02 | 显示全部楼层
不知道有比GMP还要快很多的吗?
回复

使用道具 举报

0

主题

202

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-15 13:25:35 | 显示全部楼层
先寫這麼多
  1. typedef unsigned long long u64;template<int N>struct divHelper {        static void shl(u64* dst, const u64* src, int d) {                asm("shldq %1, %%cl, %0": "=r"(dst[N]): "g"(src[N-1]), "0"(src[N]), "c"(d));        }        static void div(u64* ret, u64* mod, const u64* dive, const u64* divo) {                int cnt;                bool zf;                asm("bsrq %1, %q0": "=@ccz"(zf), "=r"(cnt): "g"(divo[N-1]));                if (zf) return divHelper<N-1>::div(ret, mod, dive, divo);                cnt ^= 63;                u64 divo2[N];                divHelper<N-1>::shl(divo2, divo, cnt);        }};template<>struct divHelper<0> {        static void shl(u64* dst, const u64* src, int d) {                *dst = *src << d;        }        static void div(u64* ret, u64* mod, const u64* dive, const u64* divo) {                __builtin_unreachable();        }};
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-24 06:44 , Processed in 0.066680 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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