我有一个算法,它依赖于大约。15 个不同的 array_views 和 8 个不同的 for_each AMP 内核调用。该算法的本质是将所有数据复制到 GPU,然后反复执行一组内核调用,直到达到某个阈值。注意:我还没有实现阈值逻辑——这需要将数据检索回 CPU。
完整的内核调用集称为一个循环。在每个周期之间,我不引用 CPU 上的任何 array_view 数据....因此,我不希望任何数据移动回 CPU。然而,周期的表现并不规律。大多数情况下,循环需要 10 毫秒左右,但随后每 3 或 4 个循环(或有时背靠背),循环需要 400 或 500 毫秒来执行。内核调用的内部逻辑始终基本相同......所以增加的执行时间不是由于GPU逻辑。
什么可能导致某些周期的时间急剧增加?请参阅下面的示例时序。
完成第一个周期的时间 503.278 (ms) 此时间包括 AMP 初始化、内核编译和数据移动到 GPU 的开销。
768 (ms) 再完成 20 个周期的时间:511.538 (ms) 再完成 21 个周期的时间:14.4339 (ms) 再完成 22 个周期的时间:252.77 (ms) 再完成 23 个周期的时间:504.565 (ms) 时间再完成 24 个循环:12.6931 (ms) 再完成 25 个循环的时间:15.5403 (ms) 再完成 26 个循环的时间:303.68 (ms) 再完成 27 个循环的时间:440.331 (ms) 再完成 28 个循环的时间:8.63698 (ms) 再完成 29 个循环的时间:13.9312 (ms) 再完成 30 个循环的时间:755.637 (ms) 退出......按任意键继续。. . 5403 (ms) 再完成 26 个周期的时间:303.68 (ms) 再完成 27 个周期的时间:440.331 (ms) 再完成 28 个周期的时间:8.63698 (ms) 再完成 29 个周期的时间:13.9312 (ms) 时间再完成 30 个循环:755.637 (ms) Exiting...... 按任意键继续。. . 5403 (ms) 再完成 26 个周期的时间:303.68 (ms) 再完成 27 个周期的时间:440.331 (ms) 再完成 28 个周期的时间:8.63698 (ms) 再完成 29 个周期的时间:13.9312 (ms) 时间再完成 30 个循环:755.637 (ms) Exiting...... 按任意键继续。. .