Есть много реальных причин, по которым вы хотели бы это сделать. У нас это потому, что у нас есть список структур данных переменной длины, и мы хотим иметь возможность изменять размер одного из элементов, не копируя их все заново.
Вот несколько вещей, которые я пробовал:
- Просто есть много аргументов ядра. Конечно, звучит халтурно, но работает для малых N. Именно этим мы и занимались.
- Сделайте 1) с каким-то циклом макросов, который расширяет аргументы ядра до максимального размера (что, я думаю, зависит от устройства). Я действительно не хочу этого делать... это звучит плохо.
- Создайте какой-то список структур, содержащих указатели, и заполните его перед вызовом ядра. Я попробовал это, и я думаю, что это нарушает спецификацию. Согласно тому, что я видел на форумах nVidia, сохранение адреса указателя устройства после одного вызова ядра является незаконным. Если кто-нибудь может указать, где в спецификации это сказано, я хотел бы знать, потому что я не могу его найти. Тем не менее, это определенно ломает аппаратное обеспечение ATI, поскольку оно перемещает объекты.
- Откажитесь, сохраните объекты переменного размера в большом массиве и напишите умный алгоритм для использования пустого пространства, чтобы весь массив приходилось реже перекомпоновывать. Это будет работать, но это неэлегантный и сложный дизайн. Кроме того, это требует много страшной арифметики указателя...
У кого-нибудь есть другие идеи? Как насчет опыта, пытающегося сделать это; есть ли наименее хакерский способ? Почему?