CudaHostRegister() schlägt mit „nicht genügend Speicher“ fehl, während cudaMallocHost() mit weitaus größeren DatenmengenC++

Programme in C++. Entwicklerforum
Guest
 CudaHostRegister() schlägt mit „nicht genügend Speicher“ fehl, während cudaMallocHost() mit weitaus größeren Datenmengen

Post by Guest »

Ich versuche, mithilfe von CUDA einen Algorithmus auf die GPU zu bringen, der prüft, ob ein geometrischer Punkt innerhalb einer Polylinie liegt. Im Moment habe ich Probleme mit der überlappenden Datenübertragung und Kernel-Ausführung bei Verwendung mehrerer separater Streams. Gemäß dieser Nvidia-Anleitung erfordert dies die Verwendung von angeheftetem Speicher. Während das Zuweisen von angeheftetem Speicher mit cudaMallocHost() und das anschließende Kopieren meiner Daten in den Speicherbereich auch dann einwandfrei zu funktionieren scheint, wenn Speicherplatz für mehrere Millionen Objekte zugewiesen wird, schlägt cudaHostRegister() mit cudaErrorMemoryAllocation fehl / „Nicht genügend Speicher“, sobald ich mit ein paar hundert Objekten arbeite. Da die Daten, die ich verarbeiten möchte, jedoch an anderer Stelle generiert werden, wäre die Verwendung von cudaMallocHost() und das Kopieren der Daten in den neu zugewiesenen Speicher ein unnötiger Umweg.
Irgendwelche Vorschläge dazu Was fehlt mir hier?
Ich arbeite an einer Nvidia RTX A2000 Laptop-GPU mit 4 GB VRAM. sizeof(PointXY) gibt 8 Bytes zurück.
Sehen Sie sich den entsprechenden Code wie folgt an. Auskommentiert, Sie können meine Version mit cudaMallocHost() sehen:
Update:
Wie in den Kommentaren gefordert, habe ich die ersetzt Originalcodebeispiel mit einem voll funktionsfähigen Beispiel.

Code: Select all

#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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post