Chinese, Simplified 字幕

← cs344_unit5_22_s_图片平铺

埋め込みコードを取得する
2言語

Showing Revision 2 created 05/13/2013 by Michael Xiao.

  1. 所以这里是我的代码。我会通过设置 k 等于 32来开始,
    这里是实际的代码。
  2. 我首先找出图块转角的位置。
  3. 这将告诉我需要从哪儿开始写入到输出
    以及从哪里开始从输入读取——
  4. 所以只是很小的记帐式记录并给变量赋予对我有意义的名称。
  5. 但正如你可以看到的,我开始
  6. 读 i 值的地方是我们所在的块乘以图块宽度的一个函数
  7. 因为每个图块是负责 1 块,就是这种情况。
  8. 而J 的值是一样的,不过是在 y,在y 而不是在x, 输出仅仅是反转 y 和 x。
  9. 好的,所以现在我知道在哪里我要读写我的图块,
  10. 我想知道要从图块的哪个元素读取和写入,
  11. 只是为了使代码更具可读性的简写形式。
  12. 我将设置x 到线程索引.x,以及y 到线程索引y。
  13. 所以,现在,代码本身是很简单的。
  14. 我定义我共享内存中的浮点数组为 k 乘以图块数组K。
  15. 然后,我从全局内存中读取并将结果写入到共享内存。
  16. 所以这就是我从全局内存的读取和图块开始位置的公式
  17. 再加上我负责的线程,或在图块中这个线程所负责的元素。
  18. 为省去额外的同步线程,我将先
  19. 以转置的方式将它写入共享内存。
  20. 所以它不是图块 x y,它是图块 y x。 好吧, 这可以节省这些同步线程的一个屏障。
  21. 我现在共享内存中存在转置的图块。
  22. 它已经被转置,我想要将它写出到全局内存。
  23. 我想以合并的方式写出,这样相邻线程写入相邻位置和内存。
  24. 换言之,相邻线程由我确定的方式在 x 上变化,
  25. 所以这是我从共享内存读出然后写入全局内存的结果。
  26. 你可以2个同步线程完成这一步。
  27. 你有可能在共享内存中读取这个,然后进行转置,
  28. 接着把它写入到全局内存。
  29. 你在把它读取到共享内存后需要一个同步线程
  30. 同样的在执行转置之后也需要一个同步线程。
  31. 所以,如果你那样做了,我鼓励你回去
  32. 将其转换为这个单一版本,并看看它变得有多快。
  33. 让我们继续,在我的笔记本电脑上运行。好的,这里有两件有趣的事情需要注意。
  34. 一是,每个元素代码的并行——我们以前有的内核——
  35. 所需的时间实际上升了。
  36. 它现在几乎比之前要慢2倍。
  37. 并且,如果你想想,此代码一点也没有改变,除了我们改变了 k 值。
  38. 我们改变了在此代码中使用的线程块的大小。
  39. 我们要回到那里。这会给我们一种进一步优化的提示。
  40. 在此期间,每个平铺元素都转置为并行, 我们的新版本。
  41. 是更快一点点了——不是快很多,那是有点令人烦恼。
  42. 我们应该去完全合并的负载和存储,那些应该有什么区别。
  43. 让我们继续并再次启动 NVVP,看看发生了什么事。