Нерегулярное поведение векторов в ядрах OpenCL (1.2) - PullRequest
1 голос
/ 26 сентября 2019

Итак, я пытаюсь выполнить какую-то операцию внутри ядра OpenCL.У меня есть этот буфер с именем filter, который представляет собой матрицу 3x3, инициализированную значением 1.

Я передаю это в качестве аргумента ядру OpenCL со стороны хоста.Проблема в том, когда я пытаюсь получить этот буфер на стороне устройства как вектор float3.Для ex -

__kernel void(constant float3* restrict filter)
{
        float3 temp1 = filter[0];
        float3 temp2 = filter[1];
        float3 temp3 = filter[2];
}

Первые две временные переменные ведут себя, как и ожидалось, и все их значения равны 1. Но третья временная переменная (temp3) имеет только компонент x как 1, а остальные из y иКомпоненты z равны 0. Когда я выбираю буфер как только вектор с плавающей точкой, все ведет себя как ожидалось.Я делаю что-то неправильно?Я не хочу использовать инструкции vload, поскольку они дают служебные данные.

1 Ответ

2 голосов
/ 26 сентября 2019

В OpenCL float3 - это просто псевдоним для float4, поэтому ваши 9 значений будут заполнять компоненты x, y, z и w temp1 и temp2, который оставляет только одно значение для temp3.x.Вам, вероятно, потребуется использовать инструкцию vload3 .

См. Раздел 6.1.5.Выравнивание типов спецификации OpenCL для получения дополнительной информации:

Для трехкомпонентных векторных типов данных размер типа данных равен 4 * sizeof(component).Это означает, что 3-компонентный векторный тип данных будет выровнен по границе 4 * sizeof(component).Встроенные функции vload3 и vstore3 могут использоваться для чтения и записи соответственно трехкомпонентных векторных типов данных из массива упакованных скалярных типов данных.

...