【问题标题】:Altivec compile errorAltivec 编译错误
【发布时间】:2013-09-16 18:13:46
【问题描述】:

我正在尝试遵循这样的简单示例 altivec 初始化:

 1 // Example1.c
 2 #include <stdio.h>
   #include <altivec.h>
 3
 4 int main()
 5 {
 6 __vector unsigned char v1;
 7
 8 // Assign 16 8-bit elements to vector v1
 9 v1 = (__vector unsigned char)(
10 '0', '1', '2', '3',
11 '4', '5', '6', '7',
12 '8', '9', 'A', 'B',
13 'C', 'D', 'E', 'F');
14
15 // Print out the contents of v1 char by char
16 // &v1 is casted to (unsigned char *)
17 for(int i = 0; i < 16; i++)
18 printf("%c", ((unsigned char *)(&v1))[i]);;
19 
20
21 return 0;
22 }

但是,当我编译时,我收到一个错误提示错误:无法在不同大小的向量值之间进行转换。

有人知道为什么会这样吗?我的 gcc 版本是 4.4.6。

我现在可以使用 Paul 的解决方案。

但是,当我尝试打印它时,它给了我错误,因为我在 Paul 的评论下发表了评论。

有人知道为什么会这样吗?

【问题讨论】:

    标签: c gcc simd powerpc altivec


    【解决方案1】:

    您需要将向量值设置为初始化的一部分:

     __vector unsigned char v1 = (__vector unsigned char)( '0', '1', '2', ... );
    

    但是对于 gcc,您可能应该使用带有花括号的更正常的语法,而不是旧的 Motorola 语法:

     __vector unsigned char v1 = { '0', '1', '2', ... };
    

    为了打印向量,某些版本的 gcc 允许 Motorola 扩展 printf 以用于 AltiVec 向量,例如

    printf("%vc\n", v1);
    

    如果这不起作用,那么您可能需要推出自己的打印例程,例如使用联合:

    void vec_print_u8(__vector unsigned char v)
    {
        union {
            __vector unsigned char v;
            unsigned char a[16];
        } u;
        int i;
    
        u.v = v;
        for (i = 0; i < 16; ++i)
        {
            printf("%2c", u.a[i]);
        }
        printf("\n");
    }
    

    【讨论】:

    • 嗨,第一行我仍然无法初始化它。但是,当我尝试使用 printf("%d\n", (unsigned char )v1[i]); 打印第二个时,第二个有效我收到一个错误说 rabind.c:91: 错误:下标值既不是数组也不是指针你知道我如何访问向量中的每个元素吗?
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多