我的情况- 作为我博士研究的一部分,我有一个动态编程算法可以使用 OpenCL 在 GPU 上实现。我使用的 GPU 包括 AMD HD 7970、7750、A10-5800K APU 和 nVidia GTX 680。我了解获得良好性能所涉及的原则和大部分最佳实践。
我的程序包含 4 个嵌套循环,并且在我的数据并行公式中,我能够展开 2 个外部循环。现在由于问题的性质,最里面的循环不能不引起分歧。输出是一个表,表示机器上的作业时间表(计算机科学)。
当线程发散(波前中的工作项采用不同的路线)时,我得到错误的值,看起来好像工作项重复了自己。例如,
t = 0, 1, 2, 3, 4, ... 63 , 64, 65, 66, 67, ...
M1 0, 0, 0, 9, 9, ... 9, 0, 0, 0, 9、...
高于工作组大小的是 64。直到 t=63 的第一个值是正确的,但请注意它是如何在 t=64 处再次重复的!它们不应该是零。这里每个工作项都映射到时间 t。
如果我修复导致分歧的参数,表格将完全填满预期的(错误)结果,没有间隙(零),所以我得到从 t=0 到 TMAX 的值 9,其中 TMAX 是 64 的倍数。
问题- 线程分歧是否有导致错误计算或未定义线程行为的趋势?
我已经在互联网、文档和书籍中挖掘了有关线程分歧和内存一致性的任何内容。我以不同的方式实现了整个程序,包括多次调用内核以排除全局内存不一致,但结果都是一样的。
任何输入将不胜感激。谢谢!