К 3: Страница спецификации OpenCL 1.1 193 говорит: «Аргументы функций ядра в программе не могут быть объявлены как указатель на указатель (и)».
Структура, содержащая указатель на указатель (указатель наобъект-буфер) может быть не против строгого чтения этого предложения, но это в духе: указатели на объекты-буферы не могут передаваться в качестве аргументов из кода хоста в ядро, даже если они скрыты внутри определенной пользователем структуры.
Я бы выбрал вариант 5: не использовать структуры данных переменного размера.Если у вас есть какой-либо способ сделать их постоянными по размеру, обязательно сделайте это.Это сделает вашу жизнь намного проще.Если быть точным, то здесь нет «структуры переменного размера».Каждое определение структуры создает структуры постоянного размера, поэтому, если размер изменился, изменилась и сама структура, и, следовательно, требуется другой объект mem.Каждый указатель, передаваемый в функцию ядра, должен иметь один тип.