为什么在使用CUDA时使用memset?

时间:2015-05-30 01:07:32

标签: c cuda nvidia

我在一个CUDA代码示例中看到,memset用于将向量初始化为所有0,这将存储另外两个向量的总和。例如:

hostRef = (float *)malloc(nBytes);
gpuRef = (float *)malloc(nBytes);    
memset(hostRef, 0, nBytes);
memset(gpuRef, 0, nBytes);

如果不对这些载体做其他事情,这会起什么作用?

您可以在此处查看代码: https://books.google.com/books?id=Jgx_BAAAQBAJ&pg=PA42#v=onepage&q&f=false

不知道链接可以使用多长时间。

3 个答案:

答案 0 :(得分:1)

当您使用'malloc'获取内存时,它不一定是空的,只有'calloc'会为您调整内存。为了理智和调试目的,建议初始化内存。

答案 1 :(得分:1)

如果不对这些载体做任何其他事情,那将毫无用处。但事实并非如此。

代码运行CUDA向量和,然后将结果复制到*gpuRef。然后它在主机CPU上执行相同的总和,并将结果放在*hostRef中。最后,它比较了两个结果。

当然,在将新数据复制到其中之前,它不会对任何一个数组执行任何操作,因此初始化为零仍然没有用处。

答案 2 :(得分:1)

这是njuffa在评论中给出的答案:

  

...... GPU内存的内容在调用之间不会发生变化   应用程序。如果程序失败,我们会想避免   从前一次运行中获取良好数据,这可能导致(错误地)   相信程序执行得很好。我见过这样的案例   现实生活中,受影响的程序员非常困惑。从而   最好将结果数据初始化为已知值,尽管我   会选择0xff而不是0,因为这对应于NaN   浮点数据的模式。