Эффективно передать большой файл (до 2 ГБ) в CUDA GPU? - PullRequest
6 голосов
/ 16 марта 2012

Я работаю над программой с ускорением на GPU, которая требует чтения всего файла переменного размера. Мой вопрос, каково оптимальное количество байтов для чтения из файла и передачи на сопроцессор (устройство CUDA)?

Эти файлы могут быть размером до 2 ГБ, поэтому создание буфера такого размера не самая лучшая идея.

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Вы можете cudaMalloc буфера максимального размера вы можете на вашем устройстве.После этого скопируйте фрагменты входных данных такого размера с хоста на устройство, обработайте их, скопируйте обратно результаты и продолжите.

// Your input data on host
int hostBufNum = 5600000;
int* hostBuf   = ...;

// Assume this is largest device buffer you can allocate
int devBufNum = 1000000;
int* devBuf;

cudaMalloc( &devBuf, sizeof( int ) * devBufNum );

int* hostChunk  = hostBuf;
int hostLeft    = hostBufNum;
int chunkNum    = ( hostLeft < devBufNum ) ? hostLeft : devBufNum;

do
{
    cudaMemcpy( devBuf, hostChunk, chunkNum * sizeof( int ) , cudaMemcpyHostToDevice);
    doSomethingKernel<<< >>>( devBuf, chunkNum );

    hostChunk   = hostChunk + chunkNum;
    hostLeft    = hostBufNum - ( hostChunk - hostBuf );
} while( hostLeft > 0 );    
0 голосов
/ 27 марта 2012

Если вы можете разделить свою функцию так, чтобы вы могли работать с чанками на карте, вы должны рассмотреть использование потоков (cudaStream_t).

Если вы планируете загрузки и выполнения ядра в нескольких потоках, вы можете иметь один поток данных загрузки, в то время как другой выполняет ядро ​​на карте, тем самым скрывая часть времени передачи ваших данных при выполнении ядра.

Вам нужно объявить буфер с тем размером, который равен размеру вашего чанка, сколько бы вы ни объявляли потоков (насколько я знаю, до 16, для вычислительных возможностей 1.x).

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