C# CUDAfy CopyFromDevice比CopyToDevice慢几个数量级

C# CUDAfy CopyFromDevice比CopyToDevice慢几个数量级,c#,cuda,cudafy.net,C#,Cuda,Cudafy.net,我正在用一个小型重力模拟来测试CUDAfy,在对代码运行探查器之后,我发现大部分时间都花在GPU的CopyFromDevice方法上。代码如下: private void WithGPU(float dt) { this.myGpu.CopyToDevice(this.myBodies, this.myGpuBodies); this.myGpu.Launch(1024, 1, "MoveBodies", -1, dt, this.myGpuBod

我正在用一个小型重力模拟来测试CUDAfy,在对代码运行探查器之后,我发现大部分时间都花在GPU的CopyFromDevice方法上。代码如下:

    private void WithGPU(float dt)
    {
        this.myGpu.CopyToDevice(this.myBodies, this.myGpuBodies);
        this.myGpu.Launch(1024, 1, "MoveBodies", -1, dt, this.myGpuBodies);
        this.myGpu.CopyFromDevice(this.myGpuBodies, this.myBodies);
    }
仅澄清一下,this.mybody是一个包含10000个结构的数组,如下所示:

[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
internal struct Body
{
    public float Mass;

    public Vector Position;

    public Vector Speed;
}
向量是一个有两个浮点数X和Y的结构

根据我的档案器,这三条线路的平均计时分别为0.092、0.192和222.873毫秒。这些计时在装有NVIDIA NVS 310的Windows 7上进行

有没有办法缩短CopyFromDevice()方法的时间

谢谢

CUDA内核启动是异步的。这意味着在启动内核之后,CPU线程立即被释放,以在内核启动之后立即处理代码,而内核仍在执行

如果后续代码包含任何种类的CUDA执行障碍,那么CPU线程将在障碍处停止,直到内核执行完成。在CUDA中,
cudaMemcpy
(cudafy
CopyFromDevice
方法下的操作)和
cudaDeviceSynchronize
(cudafy
Synchronize
方法下的操作)都包含执行障碍

因此,从主机代码的角度来看,内核启动后立即出现的这种障碍会在内核执行期间暂停CPU线程执行


由于这个原因,本例中的特定障碍将包括内核执行时间和数据复制时间。您可以在内核启动后立即使用
Synchronize
barrier方法来消除分析主机代码所指示的时间歧义。

可能实际执行处理需要222.873毫秒?CopyFromDevice需要等待处理完成后才能进行复制。我如何判断是否是这种情况?好问题。老实说,我不知道。我花了一点时间使用CUDA解决我遇到的一个问题;我最终放弃了这个概念,因为它比它的价值更麻烦,而且实际上需要更长的时间才能为我的特定问题产生结果。根据我的记忆,您将“网格”的大小定义为1024,但块仅设置为1。我认为这本质上意味着你只在GPU上使用一个线程。不要引用我的话-我现在没有时间查阅文档。他们确实有一个有用的CODAfy.net教程,其中包含一些代码示例,可能会有所帮助。Darren的第一条评论很可能就是这样。尝试添加
this.myGpu.Synchronize()this.myGpu.launch…
)。这将充当一个屏障,在允许主机线程继续之前,等待内核完成。因此,它将“吸收”内核中所有的CUDA处理时间,剩下的
CopyFromDevice
操作应在分析器中缩减到适当的大小。嗨,Robert。是的,时间花在了处理上。添加Synchronize()调用后,CopyFromDevice的时间缩短到一个更合理的数量。请添加您的评论作为接受它的答案。