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