📜  cuda 复制内存 - C++ (1)

📅  最后修改于: 2023-12-03 15:30:13.314000             🧑  作者: Mango

CUDA 复制内存 - C++

在 CUDA 中,我们经常需要将数据从主机(Host)内存复制到设备(Device)内存中,或者从设备内存复制回主机内存。这是因为 CUDA 设备通常比主机内存大小有限,因此需要频繁复制数据以便进行计算。

从主机内存到设备内存复制

我们可以使用 cudaMemcpy 函数将主机内存中的数据复制到设备内存中。函数原型如下:

cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind );

其中,dstsrc 是目标和源内存地址,count 是需要复制的字节数,kind 则是复制方向。复制方向可以是以下几种:

  • cudaMemcpyHostToDevice:从主机内存到设备内存。
  • cudaMemcpyDeviceToHost:从设备内存到主机内存。
  • cudaMemcpyDeviceToDevice:从设备内存到设备内存。

下面是一个将主机内存中的数组 h_data 复制到设备内存中数组 d_data 的示例代码:

#include <cuda_runtime.h>
#include <iostream>
#include <cstdlib>

int main()
{
    // 定义数组大小
    const int N = 1024;

    // 在主机内存上分配数组空间并初始化为随机值
    float* h_data = new float[N];
    for (int i = 0; i < N; ++i)
    {
        h_data[i] = std::rand() / (float)RAND_MAX;
    }

    // 在设备内存上分配数组空间
    float* d_data;
    cudaMalloc(&d_data, N * sizeof(float));

    // 将主机内存的数组复制到设备内存的数组上
    cudaMemcpy(d_data, h_data, N * sizeof(float), cudaMemcpyHostToDevice);

    // 使用设备内存的数组进行计算

    // 将设备内存的数组的结果复制回主机内存
    cudaMemcpy(h_data, d_data, N * sizeof(float), cudaMemcpyDeviceToHost);

    // 释放设备内存和主机内存
    cudaFree(d_data);
    delete[] h_data;

    return 0;
}
从设备内存到主机内存复制

我们可以使用 cudaMemcpy 函数将设备内存中的数据复制回主机内存。示例代码已在前面给出,这里不再赘述。

从设备内存到设备内存复制

我们可以使用 cudaMemcpy 函数将设备内存中的数据复制到另一个设备内存中。示例代码如下:

#include <cuda_runtime.h>
#include <iostream>

int main()
{
    // 定义数组大小
    const int N = 1024;

    // 在设备内存上分配数组空间
    float* d_src_data;
    cudaMalloc(&d_src_data, N * sizeof(float));
    float* d_dst_data;
    cudaMalloc(&d_dst_data, N * sizeof(float));

    // 使用设备内存的数组进行计算

    // 将 d_src_data 数组中的数据复制到 d_dst_data 数组中
    cudaMemcpy(d_dst_data, d_src_data, N * sizeof(float), cudaMemcpyDeviceToDevice);

    // 释放设备内存
    cudaFree(d_src_data);
    cudaFree(d_dst_data);

    return 0;
}
参考文献
  1. CUDA Toolkit Documentation - cudaMemcpy