На самом деле нет способа сделать то, что вы просите напрямую. API CUDA не поддерживает «умное копирование» с отступами или выравниванием, «глубокое копирование» вложенных указателей или что-то подобное. Передача памяти требует линейной памяти хоста и устройства, а выравнивание между исходной и целевой памятью должно быть одинаковым.
Сказав это, одним из способов обойти это ограничение было бы скопировать данные хоста short
в выделенную область short2
на устройстве. Код вашего устройства может получить short2
, содержащий две упакованные шорты, извлечь необходимое ему значение и затем преобразовать его в int
. Это обеспечит код 32-битных транзакций памяти на поток, что позволит объединить память и (если вы используете Fermi GPU) хорошую частоту обращений в кэш L1, потому что смежные потоки внутри блока будут читать одно и то же 32-битное слово. На графических процессорах, отличных от Fermi, вы, вероятно, могли бы использовать схему разделяемой памяти, чтобы эффективно извлекать все значения для блока, используя объединенные чтения.