设备内存刷新cuda

设备内存刷新cuda,cuda,gpu,Cuda,Gpu,我正在运行一个C程序,在这里我调用了两次cuda主机函数。我想清除这两次调用之间的设备内存。有没有办法刷新GPU设备内存??我使用的是计算能力为2.0的特斯拉M2050,如果您只想将内存归零,那么cudaMemset可能是最简单的方法。例如: const int n = 10000000; const int sz = sizeof(float) * n; float *devicemem; cudaMalloc((void **)&devicemem, sz); kernel<

我正在运行一个C程序,在这里我调用了两次cuda主机函数。我想清除这两次调用之间的设备内存。有没有办法刷新GPU设备内存??我使用的是计算能力为2.0的特斯拉M2050,如果您只想将内存归零,那么
cudaMemset
可能是最简单的方法。例如:

const int n = 10000000;
const int sz = sizeof(float) * n;
float *devicemem;
cudaMalloc((void **)&devicemem, sz);

kernel<<<...>>>(devicemem,....);
cudaMemset(devicemem, 0, sz); // zeros all the bytes in devicemem
kernel<<<...>>>(devicemem,....);
const int n=10000000;
常数int sz=sizeof(float)*n;
浮动*设备项;
Cudamaloc((无效**)和devicemem,深圳);
内核(devicemem,…);
cudaMemset(devicemem,0,sz);//将devicemem中的所有字节归零
内核(devicemem,…);

请注意,值
cudaMemset
是一个字节值,指定范围内的所有字节都设置为该值,就像标准的C
memset
一样。如果您有一个特定的单词值,那么您需要编写自己的memset内核来分配这些值

如果您使用的是推力矢量,那么您可以对要使用所需重置值重置的矢量调用
推力::fill()

thrust::device_vector< FooType > fooVec( FooSize );
kernelCall1<<< x, y >>>( /* Pass fooVec here */ );

// Reset memory of fooVec
thrust::fill( fooVec.begin(), fooVec.end(), FooDefaultValue );

kernelCall2<<< x, y >>>( /* Pass fooVec here */ );
推力::设备向量fooVec(FooSize);
kernelCall1>(/*在此处传递fooVec*/);
//fooVec的复位存储器
推力::填充(fooVec.begin(),fooVec.end(),foodaultvalue);
kernelCall2>(/*在此处传递fooVec*/);

您能更准确地解释一下“冲洗”或“清理”的含义吗?您的意思是要将内存归零,或将其设置为其他已知的非初始化值,还是指其他值?您是想“刷新”您分配的内存,还是指整个设备?我想将我分配的内存归零,以“忘记”不同内核存储在其中的值。对于问题的模糊性,很抱歉。对于memset 16位和32位值,您可以调用驱动程序API的CumeSet*函数族,例如,cuMemsetD16()或cuMemsetD32(),甚至可以从CUDA运行时应用程序获得。@Talonmes:感谢您对CUDA答案的帮助。你能直接联系我吗(名字的首字母和姓氏在我的公司网站上)?我有个问题要问你(对不起,不支持私人信息)。