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

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

Сообщение Anonymous »

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

Код: Выделить всё

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include 

class PointXY {
public:
float x;
float y;

PointXY(float x, float y) {
this->x = x;
this->y = y;
}

PointXY() {
this->x = 0;
this->y = 0;
}
};

inline
cudaError_t checkCuda(cudaError_t result)
{
#if defined(DEBUG) || defined(_DEBUG)
if (result != cudaSuccess) {
fprintf(stderr, "CUDA Runtime Error: %s\n", cudaGetErrorString(result));
}
#endif
return result;
}

int main()
{
int cPtRequest;

std::cout > cPtRequest;

// non-default stream
cudaStream_t stream;
checkCuda(cudaStreamCreate(&stream));

// needed data pointers
PointXY* ptRequest = new PointXY[cPtRequest];
cudaError_t result;
PointXY* ptRequestDev;
PointXY returnValue;
int iValidateElem = cPtRequest - 1;

// generate test data
for (int i = 0; i < cPtRequest; i++) {
ptRequest[i] = PointXY(i + 1, i + 1);
}

// allocate and pin memory
result = checkCuda(cudaHostRegister(&ptRequest, cPtRequest * sizeof(PointXY), cudaHostRegisterDefault));
checkCuda(cudaMalloc((void**)&ptRequestDev, cPtRequest * sizeof(PointXY)));

if (result == cudaSuccess) {
// copy and validate data
checkCuda(cudaMemcpyAsync(ptRequestDev, ptRequest, cPtRequest * sizeof(PointXY), cudaMemcpyHostToDevice, stream));
checkCuda(cudaMemcpyAsync(&returnValue, &ptRequestDev[iValidateElem], sizeof(PointXY), cudaMemcpyDeviceToHost, stream));
checkCuda(cudaDeviceSynchronize());
checkCuda(cudaHostUnregister(&ptRequest));

std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79343175/cudahostregister-fails-with-out-of-memory-while-cudamallochost-works-with[/url]
Ответить

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

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

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

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

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