Любые предложения по этому поводу чего мне здесь не хватает?
Я работаю над графическим процессором 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]
Мобильная версия