CUDAfy CopyFromDevice 比 CopyToDevice 慢几个数量级
CUDAfy CopyFromDevice several orders of magnitude slower than CopyToDevice
我正在使用小型重力模拟测试 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.myBodies 是一个包含 10,000 个结构的数组,如下所示:
[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
internal struct Body
{
public float Mass;
public Vector Position;
public Vector Speed;
}
而 Vector 是一个具有两个浮点数 X 和 Y 的结构。
根据我的分析器,这三行的平均时间分别为 0.092、0.192 和 222.873 毫秒。这些时间是在带有 NVIDIA NVS 310 的 Windows 7 上进行的。
有没有办法改善 CopyFromDevice() 方法的时间?
谢谢
CUDA 内核启动是异步。这意味着在启动内核后,立即释放 CPU 线程以在内核启动后立即处理代码,而内核仍在执行。
如果后续代码包含任何类型的 CUDA 执行障碍,那么 CPU 线程将在障碍处停止,直到内核执行完成。在CUDA中,cudaMemcpy
(cudafyCopyFromDevice
方法的底层操作)和cudaDeviceSynchronize
(cudafySynchronize
方法的底层操作)都包含执行障碍。
因此,从主机代码的角度来看,内核启动后立即出现的这种障碍似乎会在内核执行期间停止 CPU 线程执行。
因此,此示例中的特定障碍将包括内核执行时间和数据复制时间。您可以在内核启动后立即使用 Synchronize
屏障方法来消除通过分析主机代码指示的时间歧义。
我正在使用小型重力模拟测试 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.myBodies 是一个包含 10,000 个结构的数组,如下所示:
[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
internal struct Body
{
public float Mass;
public Vector Position;
public Vector Speed;
}
而 Vector 是一个具有两个浮点数 X 和 Y 的结构。
根据我的分析器,这三行的平均时间分别为 0.092、0.192 和 222.873 毫秒。这些时间是在带有 NVIDIA NVS 310 的 Windows 7 上进行的。
有没有办法改善 CopyFromDevice() 方法的时间?
谢谢
CUDA 内核启动是异步。这意味着在启动内核后,立即释放 CPU 线程以在内核启动后立即处理代码,而内核仍在执行。
如果后续代码包含任何类型的 CUDA 执行障碍,那么 CPU 线程将在障碍处停止,直到内核执行完成。在CUDA中,cudaMemcpy
(cudafyCopyFromDevice
方法的底层操作)和cudaDeviceSynchronize
(cudafySynchronize
方法的底层操作)都包含执行障碍。
因此,从主机代码的角度来看,内核启动后立即出现的这种障碍似乎会在内核执行期间停止 CPU 线程执行。
因此,此示例中的特定障碍将包括内核执行时间和数据复制时间。您可以在内核启动后立即使用 Synchronize
屏障方法来消除通过分析主机代码指示的时间歧义。