📅  最后修改于: 2023-12-03 15:30:13.314000             🧑  作者: Mango
在 CUDA 中,我们经常需要将数据从主机(Host)内存复制到设备(Device)内存中,或者从设备内存复制回主机内存。这是因为 CUDA 设备通常比主机内存大小有限,因此需要频繁复制数据以便进行计算。
我们可以使用 cudaMemcpy
函数将主机内存中的数据复制到设备内存中。函数原型如下:
cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind );
其中,dst
和 src
是目标和源内存地址,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;
}