d的整4乘法
LDC,GDC
和DMD
在实现int4
的乘法
方面不同.
//------ test-case.d ---------
import core.simd;
int4 mul_4_ints (int4 a, int4 b)
{
return a * b; // LDC和GDC正常,但`DMD`不正常
}
高效的int4*int4
要求Neon
或SSE4.1
,及:
1,DMD
不实现int4*int4
.
2,GDC
和LDC
用替换序列
和两条乘法指令
实现了它,GDC
有该算法.
在intel
内部,我现在告诉人们使用_mm_mullo_epi32
来保持可移植性
,它会变通
,因为该操作
有类似可移植性陷阱
.
两个解决方法:
1,从LDC
和GDC
中删除支持
,因为在SSE4.1
以下没有指定硬件
支持.用户被迫考虑可移植性
.
2,在DMD
中添加对int4*int4
的支持,以匹配
功能.用户可用core.simd
而不会担心破坏兼容性
.
我不知道什么是最好的,需要带有pmulld
指令的Neon
或SSE4.1
.
对DMD
,编译
时需要显式传递-mcpu=avx
,它在编译时,对给定类型模式
,在DMD
后端中,使用严格门
来确定式
是否映射
到单个操作码
.
即使信息
在那且可分别查询GCC
或LLVM
,GDC
和LDC
也忽略了该门
.并且只是许可性
允许操作,这确实表明,当向下传递
到后端
时,当编译目标
没有可用的操作码
时,它可能会把操作向量
拆分为更窄
的模式.
该行为
是合理的,因为严格地说,不知道优化器
是否会按有支持
的操作码
来重新写
式.
如:'a/b'
没有向量操作
,但'a>>b'
有.
在gdc-13
中,默认'-Wvector-operation-performance'
是打开的,因此至少
会收到在窄模式下
扩展式的非阻塞警告
.
DMD
的该行为与设计
一致.(如果使用-mcpu=avx
开关,它工作)
变通方案
比本地指令
慢得多.用户
可能没有发现变通方案
的慢.通知用户
没有针对它的本地指令
,用户然后可故意
地选择最适合他的指定应用
的变通方案
.
特别,用户
可能不需要本地指令
的全部能力
,所以用完整语义
是负优化
,或可选择不要求丢失的本地指令
的不同算法
.
该行为
是马努
请求的,他花了大量时间
编写高性能向量代码
.
GDC
和LDC
对此有不同的哲学,这是他们的特权.
因此,我把它标记为无效
,因为行为
是故意的,而不是漏洞
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现