Visual Studio C++ 中的 v4sf 和 __attribute__ 等效项是什么?

发布于 2024-12-18 10:30:32 字数 709 浏览 3 评论 0原文

typedef float v4sf __attribute__ ((mode(V4SF)));

这是在海湾合作委员会。有人知道等价语法吗?

VS 2010将显示__attribute__没有这种类型的存储类,并且模式未定义。

我在网上搜索了一下,上面说

相当于GCC中的__attribute__(aligned(size))

很有帮助 对于前 UNIX 开发人员或编写适用于 UNIX 的代码的人 在 GCC 中您可以使用多个平台获得相同的结果 属性(对齐(...))

请参阅此处了解更多信息: http://gcc.gnu。 org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html#Type-Attributes

完整的 GCC 代码在这里:http://pastebin.com/bKkTTmH1

typedef float v4sf __attribute__ ((mode(V4SF)));

This is in GCC. Anyone knows the equivalence syntax?

VS 2010 will show __attribute__ has no storage class of this type, and mode is not defined.

I searched on the Internet and it said

Equivalent to __attribute__( aligned( size ) ) in GCC

It is helpful
for former unix developers or people writing code that works on
multiple platforms that in GCC you achieve the same results using
attribute( aligned( ... ) )

See here for more information:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html#Type-Attributes

The full GCC code is here: http://pastebin.com/bKkTTmH1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

波浪屿的海角声 2024-12-25 10:30:32

如果您要在 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++ 中)是编译器特定的扩展。

编辑:

现在我再次查看代码,需要做的工作不仅仅是将 __attribute__ 行替换为 VC++ 等效项以使其在 VC++ 中进行编译。

如果您正在使用以下宏/函数,则 VC++ 没有任何宏/函数:

  • __builtin_ia32_xorps
  • __builtin_ia32_loadups
  • __builtin_ia32_mulps
  • __builtin_ia32_addps
  • __builtin_ia32_storeups

你最好将所有这些替换为 SSE 内在函数 - 适用于两者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;
}

If you're looking for the alignment directive in VC++ it's __declspec(align(16)). (or whatever you want the alignment to be)

And example usage is this:

__declspec(align(16)) float x[] = {1.,2.,3.,4.};

http://msdn.microsoft.com/en-us/library/83ythb65.aspx

Note that both attribute (in GCC) and __declspec (in VC++) are compiler-specific extensions.

EDIT :

Now that I take a second look at the code, it's gonna take more work than just replacing the __attribute__ line with the VC++ equivalent to get it to compile in VC++.

VC++ doesn't have any if these macros/functions that you are using:

  • __builtin_ia32_xorps
  • __builtin_ia32_loadups
  • __builtin_ia32_mulps
  • __builtin_ia32_addps
  • __builtin_ia32_storeups

You're better off just replacing all of those with SSE intrinsics - which will work on both GCC and VC++.


Here's the code converted to intrinsics:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文