我在一个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
不知道链接可以使用多长时间。
答案 0 :(得分:1)
当您使用'malloc'获取内存时,它不一定是空的,只有'calloc'会为您调整内存。为了理智和调试目的,建议初始化内存。
答案 1 :(得分:1)
如果不对这些载体做任何其他事情,那将毫无用处。但事实并非如此。
代码运行CUDA向量和,然后将结果复制到*gpuRef
。然后它在主机CPU上执行相同的总和,并将结果放在*hostRef
中。最后,它比较了两个结果。
当然,在将新数据复制到其中之前,它不会对任何一个数组执行任何操作,因此初始化为零仍然没有用处。
答案 2 :(得分:1)
这是njuffa在评论中给出的答案:
...... GPU内存的内容在调用之间不会发生变化 应用程序。如果程序失败,我们会想避免 从前一次运行中获取良好数据,这可能导致(错误地) 相信程序执行得很好。我见过这样的案例 现实生活中,受影响的程序员非常困惑。从而 最好将结果数据初始化为已知值,尽管我 会选择0xff而不是0,因为这对应于NaN 浮点数据的模式。