我的标题的意思是,我实现了一个光线追踪程序。在程序中,由于内存问题,我将数组分成了块。在跟踪每个光线块之后,我将新的块发送到 openCL 内核。但在一个块中,当只有一条光线仍在弹跳并且所有其他光线都被追踪时,已经完成的光线将需要等待一条光线。这不是很有效。我想要做的是,为 CPU 端的每个线程分配一块光线,当线程完成其块时,它们将向 cpu 发送一个信号,我将为该线程分配另一块光线。
谢谢您的建议。
这是不可能的。在工作组(此处为光线块)内,完成的光线始终必须等待剩余的光线。
但是,您可以做的是让一个块计算屏幕上 8x8 像素正方形的光线,这样所有这些光线(具有非常相似的方向)也很有可能进行相似数量的交叉。这比将块制作为 64x1 像素的条带要快,后者条带左侧和右侧之间的反弹不同的可能性更大。请参阅我对此的技术演讲。
最后,您的内核范围应该是一次整个图像,并且仅执行一次。不要一一调度单个工作组,让 GPU 调度程序为您完成此操作。