Я пытаюсь реализовать на графическом процессоре алгоритм, который проверяет, лежит ли геометрическая точка внутри полилинии, с помощью 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
CudaHostRegister() завершается сбоем из-за «недостатка памяти», тогда как cudaMallocHost() работает с гораздо большими о ⇐ C++
Программы на C++. Форум разработчиков
1736436624
Anonymous
Я пытаюсь реализовать на графическом процессоре алгоритм, который проверяет, лежит ли геометрическая точка внутри полилинии, с помощью CUDA. Прямо сейчас я борюсь с перекрытием передачи данных и выполнения ядра с использованием пары отдельных потоков. Следуя инструкциям Nvidia, для этого требуется использование закрепленной памяти. Хотя выделение закрепленной памяти с помощью cudaMallocHost() и последующее копирование моих данных в область памяти, похоже, работает нормально, даже при выделении места для нескольких миллионов объектов, cudaHostRegister() завершается с ошибкой cudaErrorMemoryAllocation / "недостаточно памяти", как только я работаю с несколькими сотнями объектов. Однако, поскольку данные, которые я хочу обработать, генерируются где-то еще, использование cudaMallocHost() и копирование данных во вновь выделенную память было бы ненужным обходным путем.
Любые предложения по этому поводу чего мне здесь не хватает?
Я работаю над [b]графическим процессором Nvidia RTX A2000 для ноутбука[/b] с 4 ГБ видеопамяти. [b]sizeof(PointXY)[/b] возвращает 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79343175/cudahostregister-fails-with-out-of-memory-while-cudamallochost-works-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия