typedef float v4sf __attribute__ ((mode(V4SF)));
这是在GCC。任何人都知道等价语法?
VS 2010将显示__attribute__
没有此类型的存储类,并且未定义模式。
我在互联网上搜索了它说
相当于GCC中的
__attribute__( aligned( size ) )
很有帮助 对于前unix开发人员或编写可用的代码的人 在GCC中你可以使用多个平台获得相同的结果 属性(对齐(...))
有关更多信息,请参阅此处: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html#Type-Attributes
完整的GCC代码位于:http://pastebin.com/bKkTTmH1
答案 0 :(得分:4)
如果你在VC ++中寻找对齐指令,它是__declspec(align(16))
。 (或任何你想要的对齐方式)
示例用法是:
__declspec(align(16)) float x[] = {1.,2.,3.,4.};
http://msdn.microsoft.com/en-us/library/83ythb65.aspx
请注意,attribute
(在GCC中)和__declspec
(在VC ++中)都是特定于编译器的扩展。
编辑:
现在我再看一下代码,除了用VC ++等效替换__attribute__
行以使其在VC ++中编译之外,还需要做更多的工作。
VC ++没有任何你正在使用的宏/函数:
__builtin_ia32_xorps
__builtin_ia32_loadups
__builtin_ia32_mulps
__builtin_ia32_addps
__builtin_ia32_storeups
你最好只用SSE intrinsics替换所有这些 - 这将适用于GCC和VC ++。
这是转换为内在函数的代码:
float *mv_mult(float mat[SIZE][SIZE], float vec[SIZE]) {
static float ret[SIZE];
float temp[4];
int i, j;
__m128 m, v, r;
for (i = 0; i < SIZE; i++) {
r = _mm_xor_ps(r, r);
for (j = 0; j < SIZE; j += 4) {
m = _mm_loadu_ps(&mat[i][j]);
v = _mm_loadu_ps(&vec[j]);
v = _mm_mul_ps(m, v);
r = _mm_add_ps(r, v);
}
_mm_storeu_ps(temp, r);
ret[i] = temp[0] + temp[1] + temp[2] + temp[3];
}
return ret;
}
答案 1 :(得分:1)
V4SF和朋友们有关GCC“矢量扩展”:
http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Vector-Extensions.html#Vector%20Extensions
http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/X86-Built-in-Functions.html
我不确定在MSVS / MSVC中支持多少 - 如果有这些东西 - 。以下是一些链接:
http://www.codeproject.com/KB/recipes/sseintro.aspx?msg=643444
http://msdn.microsoft.com/en-us/library/y0dh78ez%28v=vs.80%29.aspx