Ошибка компиляции Altivec
Я пытаюсь следовать простой пример инициализации 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.
Теперь я понимаю, как работает решение Пола.
Однако, когда я пытаюсь напечатать это, это дает мне ошибку, поскольку я прокомментировал под комментарием Пола.
Кто-нибудь знает, почему это так?
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");
}