Есть пример shuffle OpenCL во время документ.
//Examples that are not valid are:
uint8 mask;
short16 a;
short8 b;
b = shuffle(a, mask); // invalid
Но не могу понять почему. Я тестировал это во время Android с AndroidStudio, и результат сказал: сбой программы сборки: BC-src-code: 9: 9: {9: 9-9: 16}: ошибка: нет соответствующей встроенной функции для вызова 'перемешивания'. Затем я меняю короткая на int, вот так:
uint8 mask;
int16 a;
int8 b;
b = shuffle(a, mask);
и это нормально. Я не могу найти причину в документе, может ли кто-нибудь мне помочь? Спасибо!





Я думаю, что критическая часть описания в спецификации такова:
The size of each element in the mask must match the size of each element in the result.
Я понимаю, что это означает, что если вы хотите перетасовать вектор short, ваша маска должна быть вектором ushort; маска uint8 будет действительна только для перетасованных векторов с элементами из 4 байтов - другими словами, int, uint и float.
Таким образом, снова должно быть действительным следующее:
ushort8 mask; // <-- changed
short16 a;
short8 b;
b = shuffle(a, mask); // now valid
Требование того, чтобы маска была беззнаковой, обозначается как заявлен как ugentype. Я предполагаю, что правило, согласно которому типы компонентов имеют одинаковый размер, возможно, так, что можно использовать один и тот же регистр SIMD? В любом случае, если вы узнаете об этом, это не составит труда.
Спасибо, по моему тесту вы правы. Но я не могу понять преимуществ этого правила. Кроме того, я обнаружил, что маска должен быть беззнаковый тип, который не упоминается в документе.
ushort8 mask;в порядке, аshort8 mask;выйдет из строя. Возможно, это связано с платформой.