Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 作业7 OpenMP更新进度条问题

Tagged: 

Viewing 5 reply threads
  • Author
    Posts
    • #5933 Score: 0
      小狮子
      Participant
      1 pt

      我通过 parallel for直接把castRay变成了多线程~
      但现在有个问题,我不知道要如何更新我的进度条。。

      正常来说 也许我会开一个轮询线程 每隔一段时间 调用UpdateProgress
      但不太理解OpenMP应该如何做这个操作。。,但如果我通过在parallel语句中加锁 来写进度条,则会减慢了很大的速度。

      • This topic was modified 4 years, 7 months ago by 小狮子.
    • #5935 Score: 0
      Keneyr
      Participant
      7 pts

      +1 ,我也想知道

    • #5939 Score: 0
      arc
      Participant
      5 pts

      你可以把最内层的 UpdateProgress() 去掉,再对外层的 UpdateProgress() 加锁。

    • #5940 Score: 0
      Yinda Xu
      Participant
      -1 pt

      考虑update移到最内层循环,对统一的counter累加,然后外包pragma critical?
      atomic貌似报错,只能critical了.

      Attachments:
      You must be logged in to view attached files.
      • #5946 Score: 0
        小狮子
        Participant
        1 pt

        我把 paralle for 移到了第二个循环,得益于 OpenMP是从主线程开始 顺序执行这点, 我的确可以更新进度条,在每行像素渲染完的时候。
        但实际上我还是想知道OpenMP有没有回调或者通过额外的 线程来轮询的写法来按我自己想要的频率来更新进度条~

    • #6024 Score: 0
      Troy
      Participant
      -1 pt

      openmp的critical和atomic性能差距非常大,尽量不要用critical吧。可以只对++m;这一句atomic

    • #6091 Score: 0
      Yadi Cao
      Participant
      2 pts

      我这边实现的办法是改变loop的对象由“行和列,i和j”变成直接loop m,然后i j可以由m计算得到,这样就不用担心parfor在哪一层的问题。

      进度条更新我采纳的办法是,只让第一个线城去输出就不会打乱屏幕了。但需要注意怎么根据第一个线程完成渲染的像素数量来估计全局的完成进度,我直接是 进度 = 线程数 * 第一个线程完成像素/总像素数。

      这两步实现下来也不用加锁或者用critical,效率还可以。

Viewing 5 reply threads
  • You must be logged in to reply to this topic.