YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Chinese, Simplified subtitles

← cs344_unit2_34_s_让我们为一些代码计算时间

Get Embed Code
2 Languages

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

  1. 那么一次性讲解这些—— 一百万个线程递增一百万个元素
  2. 确实给出了正确的答案, 因为在这样的情况下,
  3. 只有唯一的元素对应每个线程,所以并不存在冲突。
  4. 所以,即使我们并没有构造这些原子递增,我们还是安全的。
  5. 一百万个线程原子递增一百万个元素,当然也是安全的。
  6. 所以你也会得到正确的答案。
  7. 一百万个线程递增一百个元素和我们之前看到过的示例相同。
  8. 正如我们所见,那将给出错误答案,除非我们使用原子计算。
  9. 所以下一条是错的,第四条是正确的。
  10. 最后,一千万个线程原子递增一百个元素仍然是正确的答案。
  11. 因此除了一条以外,这些给你提供了正确答案。
  12. 好的,更有趣的问题是各个选项花了多少时间来完成?
  13. 最快的,或许与大家的直觉相反, 最有可能是选项3 ——
  14. 一百万个线程写入一百个元素中。
  15. 第二快的是选项1 ——
  16. 一百万个线程写入一百万个元素。
  17. 在我们的笔记本电脑上,
    此2个运算大概分别花了3.2毫秒以及3.4毫秒。
  18. 当然,这不是一个非常有用的选项因为它没有给出正确答案。
  19. 但看看发生了什么仍然是有趣的。
  20. 更快一些的原因是你让你的100万个线程都
  21. 试图写入到相同的100个元素中。
  22. 这100个元素占用了极少部分的内存,
  23. 因此它们将能刚好放入这个系统的一条或两条高速缓存行,
  24. 然而一百万个元素过于巨大以至于无法适应缓存。
  25. 实际上你不得不更多地访问动态随机存储器,
    也就是全局内存存储的地方。
  26. 同样的原因,一百万个线程原子写入100个元素
  27. 将比一百万个线程写入一百万个元素快一点点。
  28. 所以接下来最快的是选项4。下一个最快的则为选项2。
  29. 同样在我的系统,它们将花费3.6毫秒和3.8毫秒,
  30. 这意味着所有选项中最慢的是
  31. 一千万条线程写入一百个元素。
  32. 这实际是36毫秒,完成它大概花了之前选项的10倍时间。
  33. 并不奇怪,它有10倍的工作量。
  34. 所以你可以稍微研究一下这个代码。
  35. 比如,当你用更多的线程写入更少的元素时,
    看看时间会发生什么变化。
  36. 此处的重要教训就是原子内存运算是有代价的。