Можно ли использовать cudaMemcpy с src и dest как разные типы? - PullRequest
0 голосов
/ 09 января 2012

Я использую Tesla, и в первый раз у меня заканчивается память процессора вместо памяти GPU!Поэтому я подумал, что смогу сократить размер памяти хоста, переключив все целые числа на короткие (все мои значения ниже 255).

Однако я хочу, чтобы память моего устройства использовала целые числа, так как доступ к памятиБыстрее.Так есть ли способ скопировать память моего хоста (вкратце) в глобальную память моего устройства (в int)?Я думаю, это не сработает:

short *buf_h = new short[100];
int *buf_d = NULL;

cudaMalloc((void **)&buf_d, 100*sizeof(int));

cudaMemcpy( buf_d, buf_h, 100*sizeof(short), cudaMemcpyHostToDevice );

Есть идеи?Спасибо!

1 Ответ

3 голосов
/ 09 января 2012

На самом деле нет способа сделать то, что вы просите напрямую. API CUDA не поддерживает «умное копирование» с отступами или выравниванием, «глубокое копирование» вложенных указателей или что-то подобное. Передача памяти требует линейной памяти хоста и устройства, а выравнивание между исходной и целевой памятью должно быть одинаковым.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...