CUDA内核可以修改主机内存吗
Can CUDA Kernels Modify Host Memory?
是否有任何方法可以让内核通过将指向整数的指针传递给内核来修改该整数?指针似乎指向设备内存中的一个地址,因此内核不会影响主机。
下面是一个我注意到的行为的简化示例。
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
__global__
void change_cuda(int* c);
void change_var(int* c);
int main() {
using namespace std;
int c = 0;
int* ptc = &c;
change_var(ptc); // *ptc = 123
cout << c << endl;
cudaError_t errors;
cudaMallocManaged((void**)&ptc, sizeof(int));
change_cuda<<<1, 1>>> (ptc); // *ptc = 555
errors = cudaDeviceSynchronize();
cudaFree(ptc);
cout << cudaGetErrorString(errors) << endl;
cout << c << endl;
return 0;
}
__global__
void change_cuda(int* c) {
*c = 555;
}
void change_var(int* c) {
*c = 123;
}
理想情况下,这将在最后将c
修改为555,但此示例的输出为
123
no error
123
很明显,我误解了这是怎么回事。获得我期望的行为的正确方法是什么?
是的,你有误解。cudaMallocManaged
是分配器,例如malloc
或new
。它返回一个指针,指向请求大小的新分配。
这不是允许从设备代码访问基于主机堆栈的变量的某种方法。
然而,cudaMallocManaged
返回的指针所指向的分配区域可以从设备代码或主机代码访问。(它不会指向您的c
变量。(
您可以通过进行以下更改来最低限度地修复代码。1.注释掉对cudaFree
的调用。2.打印出*ptc
的值,而不是c
的值。也许一个更明智的改变可能是这样的:
int main() {
using namespace std;
int* ptc;
cudaMallocManaged((void**)&ptc, sizeof(int));
change_var(ptc); // *ptc = 123
cout << *ptc << endl;
cudaError_t errors;
change_cuda<<<1, 1>>> (ptc); // *ptc = 555
cudaDeviceSynchronize();
errors = cudaGetLastError();
cout << cudaGetErrorString(errors) << endl;
cout << *ptc << endl;
return 0;
}
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- Valgrind 在主机名命令输出中显示内存泄漏
- 使用恒定内存将结构数组从主机复制到设备
- 我什么时候应该首选写入组合 CUDA 分配的映射主机内存
- 如何将设备内存中分配的结构化数据从设备复制到主机
- 如何在主机内存上分配 OpenCL 缓冲区的一半,在设备内存上分配另一半
- OpenCL / c++主机代码并发运行和内存维护
- 在OpenCL中分配内存,创建一个主机指针,但直到需要时才将其写入设备
- CUDA:分配1d设备内存来将2d指针到指针主机数组复制到GPU
- Cuda统一了gpu和主机之间的内存