В CUDA 6 представлена унифицированная память, которая позволяет выполнять этот тип операции. Все, что вам нужно сделать, это изменить ваш вызов cudaMalloc на cudaMallocManaged, и вы должны иметь доступ к памяти как с графического процессора, так и с CPU без явного вызова cudaMemcpy или запуска ядра.
float* vector;
cudaMallocManaged(&vector, sizeof(float)*100);
vector[53] = 2.345;
cudaFree(vector);
Одна вещь, чтобы отметить, что это поддерживается только на новых картах NVIDIA (sm_30 и выше) и работает только на 64-разрядных операционных системах Windows, и Linux. Кроме того, в зависимости от вашей системы и вашего использования этот тип доступа может быть не таким эффективным, как традиционные функции cudaMemcpy или cudaMemset
Ха-ха, конечно же, Unified Memory не имеет прямого доступа к памяти. Он просто скрывает копирование данных. Платформа поддерживает отображение памяти устройства в адресное пространство процессора, NVIDIA только что выбрала возможность не раскрывать эту возможность по разным причинам. – ArchaeaSoftware