использует cudaHostAlloc хорошо для моего случая - PullRequest
2 голосов
/ 07 июля 2011

Я запускаю ядро ​​несколько раз, пока не найдено решение. решение будет найдено как минимум одним блоком.
поэтому, когда блок находит решение, он должен сообщить процессору, что решение найдено, поэтому процессор печатает решение, предоставленное этим блоком.
так что я сейчас делаю следующее:

__global__ kernel(int sol)
{
   //do some computations
   if(the block found a solution)
        sol = blockId.x //atomically
}

теперь при каждом обращении к ядру я копирую sol обратно в память хоста и проверяю его значение. например, если для него установлено значение 3, я знаю, что blockid 3 нашел решение, и теперь я знаю, где начинается индекс решения, и копирую решение обратно на хост. в этом случае будет ли лучше использовать cudaHostAlloc? кроме того, копирование значения одного целого числа при каждом вызове ядра замедляет мою программу?

1 Ответ

1 голос
/ 07 июля 2011

Выпуск копии из GPU в CPU и ожидание ее завершения замедлит вашу программу немного . Обратите внимание, что если вы решите отправить 1 байт или 1 КБ, это не будет иметь большого значения. В этом случае пропускная способность - не проблема, а задержка.

Но запуск ядра тоже занимает некоторое время. Если «ядро» вашего алгоритма находится в самом ядре, я бы не стал тратить слишком много времени на эту маленькую передачу.

Обратите внимание: если вы решите использовать отображенную память, вместо использования cudaMemcpy, вам нужно будет явно установить барьер cudaDeviceSynchronise (или cudaThreadSynchronise со старым CUDA) (в отличие от неявного барьера в cudaMemcpy) до прочтения статуса. В противном случае ваш код хоста может начать читать старое значение, хранящееся в вашей закрепленной памяти, прежде чем ядро ​​перезапишет его.

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