CUDA中Unified Memory函数cudaMallocManaged的使用

Unified Memory是啥参见其他博主文章,主要就是简化代码,不需要各种cudamalloc和cudamemcpy。

cuda_runtime_api.h中的接口:extern host cudart_builtin cudaError_t CUDARTAPI cudaMallocManaged(void **devPtr, size_t size, unsigned int flags __dv(cudaMemAttachGlobal));
一般传前两个参数即可。

传指针时先在C代码中malloc,然后cudaMallocManaged(),再赋值,否则cudaMallocManaged()会将值重置为0,结构体内指针重置为00000000。

如果代码不能正常运行,将中文注释删掉。

简单数据类型指针:

int *a = nullptr;
a = (int*)malloc(sizeof(int));
*a = 222;
printf("%d\n", *a);//打印是222
...调用cuda函数//无法调用,会报错退出
cudaMallocManaged((void**)&a, sizeof(int));
cudaDeviceSynchronize();
printf("%d\n", *a);//打印是0
...调用cuda函数//cuda中打印也是0
*a = 222;
printf("%d\n"
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA(Compute Unified Device Architecture)是一种针对NVIDIA GPU的并行计算平台和编程模型。使用CUDA编写程序,可以利用GPU的并行处理能力,加速计算任务的执行。 以下是使用CUDA编写程序的步骤: 1. 安装CUDA工具包和相应的GPU驱动程序。 2. 创建一个CUDA程序,包含需要在GPU上执行的函数。 3. 在程序使用CUDA API函数,将数据从主机内存复制到GPU内存。 4. 在程序使用CUDA API函数,调用需要在GPU上执行的函数,并指定线程块和线程网格的大小。 5. 在程序使用CUDA API函数,将计算结果从GPU内存复制回主机内存。 6. 编译CUDA程序,并在GPU上运行。 以下是一个简单的CUDA程序示例,计算向量加法: ```c++ #include <stdio.h> #include <cuda.h> __global__ void add(int *a, int *b, int *c) { int i = blockIdx.x * blockDim.x + threadIdx.x; c[i] = a[i] + b[i]; } int main(void) { int *a, *b, *c; // host data int *d_a, *d_b, *d_c; // device data int size = N * sizeof(int); // Allocate memory for host data a = (int *)malloc(size); b = (int *)malloc(size); c = (int *)malloc(size); // Allocate memory for device data cudaMalloc((void **)&d_a, size); cudaMalloc((void **)&d_b, size); cudaMalloc((void **)&d_c, size); // Initialize host data for (int i = 0; i < N; i++) { a[i] = i; b[i] = i; } // Copy host data to device data cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice); cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice); // Launch kernel on GPU add<<<N/256, 256>>>(d_a, d_b, d_c); // Copy result from device data to host data cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost); // Print result for (int i = 0; i < N; i++) { printf("%d ", c[i]); } printf("\n"); // Free memory free(a); free(b); free(c); cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); return 0; } ``` 在这个示例程序,add函数是在GPU上执行的函数使用__global__关键字标识该函数为在GPU上执行的函数。在主函数,首先分配主机和设备内存,然后将主机数据复制到设备内存。调用add函数时,指定线程块大小和线程网格大小。最后,将设备内存的计算结果复制到主机内存

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值