CudaHostRegister() завершается сбоем из-за «недостатка памяти», тогда как cudaMallocHost() работает с гораздо большими оC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 CudaHostRegister() завершается сбоем из-за «недостатка памяти», тогда как cudaMallocHost() работает с гораздо большими о

Сообщение Anonymous »

Я пытаюсь реализовать на графическом процессоре алгоритм, который проверяет, лежит ли геометрическая точка внутри полилинии, с помощью CUDA. Прямо сейчас я борюсь с перекрытием передачи данных и выполнения ядра с использованием пары отдельных потоков. Следуя инструкциям Nvidia, для этого требуется использование закрепленной памяти. Хотя выделение закрепленной памяти с помощью cudaMallocHost() и последующее копирование моих данных в область памяти, похоже, работает нормально, даже при выделении места для нескольких миллионов объектов, cudaHostRegister() завершается с ошибкой cudaErrorMemoryAllocation / "недостаточно памяти", как только я работаю с несколькими сотнями объектов. Однако, поскольку данные, которые я хочу обработать, генерируются где-то еще, использование cudaMallocHost() и копирование данных во вновь выделенную память было бы ненужным обходным путем.
Любые предложения по этому поводу чего мне здесь не хватает?
Я работаю над графическим процессором Nvidia RTX A2000 для ноутбука с 4 ГБ видеопамяти. sizeof(PointXY) возвращает 8 байт.
Смотрите соответствующий код следующим образом. Закомментировав мою версию, вы можете увидеть мою версию, используя cudaMallocHost():
long calcGPU(PointXY* ptRequest, long cPtRequest, PointXY* ptPoly, long cPtPoly, bool* bPtRequestIn) {
[...]

int blockSize = 512;
int numBlocks = (cPtRequest + blockSize - 1) / blockSize;

// *** Daten in kleineren Portionen asynchron übertragen und parallel berechnen ***
bool bOverlapTransactions = true;

if (bOverlapTransactions && devProps->deviceOverlap) {
cudaError_t result;

// Host-Speicher pinnen
result = cudaHostRegister(&ptRequest, cPtRequest * sizeof(PointXY), cudaHostRegisterDefault);
//PointXY* ptRequestTmp = ptRequest;
//result = cudaMallocHost((void**)&ptRequest, cPtRequest * sizeof(PointXY));
//printGPUErrMsg(result, "Pinning");
//memcpy(ptRequest, ptRequestTmp, cPtRequest * sizeof(PointXY));
//delete[] ptRequestTmp;
//ptRequestTmp = nullptr;

// Fehler beim Pinnen abfangen
if (result != cudaSuccess) {
printGPUErrMsg(result, "Pinning");
std::cout

Подробнее здесь: https://stackoverflow.com/questions/793 ... works-with
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»