没有原始SIMD数据类型的基本原理

时间:2010-09-06 00:55:17

标签: programming-languages language-design simd

(对不起,如果这听起来像是一个咆哮,但这是一个真正的问题,我很欣赏真正的答案)

据我所知,由于C太旧了,所以当时添加它可能没有意义(当时MMX甚至不存在)。但从那以后就有了C99,而且SIMD变量仍然没有标准(据我所知)。

“SIMD变量”,我的意思是:

vec2_int a = {2, 2};
vec2_int b = {3, 3};
a += b;

我也明白这可以用结构来完成,并且(理论上)编译器应该优化它以便在适当的时候使用SIMD。

但我最近看到来自Qt Labs的帖子,其中包含类似“__m128i”(看起来非标准)等类型的示例,而不是依赖于优化。考虑到Qt宣称这会大大提高Qt的速度,我猜测编译器优化是不够的,至少对于一些程序员而言。

如果只是C,我认为C是愚蠢的。但是,据我所知,C ++,Java和C#等新语言也不包括这些语言。 C#有Mono.SIMD,但它不是原始类型(因为C#有一个“十进制”关键字,我不认为他们试图保存类型)。

所以这就是我注意到的:带有矢量基元类型的语言似乎是例外,而不是规则。 因为矢量基元类型看起来很明显,所以我猜测必须有一些正当理由不要包含这些类型。

有没有人知道为什么这些类型经常被排除在外?一些关于添加它们的理由的链接?

1 个答案:

答案 0 :(得分:5)

因为并非所有处理器都支持SIMD指令。 C和C ++(甚至Java和C#)等语言设计用于除台式计算机之外的不同类型的硬件,如微控制器。

目前,算法的矢量化不是自动的(尽管正在积极研究)。必须明确编写“可矢量化”的算法,以利用执行环境的任何SIMD功能。