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