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

使用CUDA时为什么要使用memset?,c,cuda,nvidia,C,Cuda,Nvidia,我在CUDA代码示例中看到,memset用于将向量初始化为所有0,这些0将存储其他两个向量的总和。例如: hostRef = (float *)malloc(nBytes); gpuRef = (float *)malloc(nBytes); memset(hostRef, 0, nBytes); memset(gpuRef, 0, nBytes); 如果对这些向量不做任何其他操作,这有什么作用 您可以在此处看到代码: 但不确定链接能工作多久。当您使用“malloc”获取内存时,它不

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

hostRef = (float *)malloc(nBytes);
gpuRef = (float *)malloc(nBytes);    
memset(hostRef, 0, nBytes);
memset(gpuRef, 0, nBytes);
如果对这些向量不做任何其他操作,这有什么作用

您可以在此处看到代码:


但不确定链接能工作多久。

当您使用“malloc”获取内存时,它不一定是空的,只有“calloc”会为您将内存归零。建议您初始化内存,以达到健全和调试的目的。

当您使用“malloc”获取内存时,它不一定是空的,只有“calloc”会将内存归零。建议出于健全和调试的目的初始化内存。

如果不对这些向量进行任何其他操作,则没有任何作用,但事实并非如此

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


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

如果不对这些向量执行其他操作,则没有任何作用,但情况并非如此

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


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

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

…GPU内存的内容在调用 应用程序。在程序失败的情况下,我们希望避免 从上一次运行中获取良好数据,这可能导致(错误地) 相信程序执行得很好。我在英国见过这种情况 现实生活中,这让受影响的程序员非常困惑。因此 最好将结果数据初始化为已知值,尽管 将选择0xff而不是0,因为这对应于NaN 浮点数据的模式


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

…GPU内存的内容在调用 应用程序。在程序失败的情况下,我们希望避免 从上一次运行中获取良好数据,这可能导致(错误地) 相信程序执行得很好。我在英国见过这种情况 现实生活中,这让受影响的程序员非常困惑。因此 最好将结果数据初始化为已知值,尽管 将选择0xff而不是0,因为这对应于NaN 浮点数据的模式


在调用
checkResult()
时,似乎还进一步使用了这些变量。GPU内存的内容在应用程序调用之间不会改变。在程序失败的情况下,我们希望避免从上一次运行中获取良好的数据,这可能导致(错误地)认为程序执行得很好。我在现实生活中见过这样的情况,这让受影响的程序员感到非常困惑。因此,最好将结果数据初始化为已知值,尽管我会选择
0xff
而不是
0
,因为这对应于浮点数据的NaN模式-->测试
NULL
的错误方法?@njuffa这很有意义。如果你给我一个答案,我可以接受。在调用
checkResult()
时,这些变量似乎有进一步的用途。GPU内存的内容在应用程序调用之间不会改变。在程序失败的情况下,我们希望避免从上一次运行中获取良好的数据,这可能导致(错误地)认为程序执行得很好。我在现实生活中见过这样的情况,这让受影响的程序员感到非常困惑。因此,最好将结果数据初始化为已知值,尽管我会选择
0xff
而不是
0
,因为这对应于浮点数据的NaN模式-->测试
NULL
的错误方法?@njuffa这很有意义。如果你回答我可以接受。值得注意的是,在调试期间使用CUDA内存检查器时,它会自动0的所有分配内存。因此,如果您正在读取未初始化的内存,则分配0更有可能在发布版和调试版之间产生一致的行为。值得注意的是,在调试期间使用CUDA内存检查器时,它会自动分配0的所有内存。因此,如果您正在读取未初始化的内存,则0'ing分配更有可能在发布和调试版本之间产生一致的行为。