2012-07-19 63 views
2

我正在写一个代码,它必须执行一个块间同步(N维和其他内存传输操作的总和)。当我增加问题的维度时,结果是错误的。cuda线程

我做synchornization与_ threadfence()和第一维度(N < 192),这是确定的,但如果我在一段代码插入其他 _threadfence(),结果是正确的为更多维度。

一个threadfence()不足以同步?有意义的是,数据结果在同一个块中使用。

在节目指南的信息表明,threadfence等待所有的存储空间已经准备好(共享和全球)

+0

欢迎堆栈溢出。我认为你的问题中没有足够的信息让某人能够给予很好的答复。你有没有在CUDA C编程指南中检查'__threadfence()'的部分以查看它是否按照你期望的方式工作? – 2012-07-20 00:36:44

+0

请为您的问题提供示例代码。 – harrism 2012-09-19 00:31:02

回答

7

还有就是块之间的同步没有很好的方式。你可以采用哈希方式来等待自旋并消耗GPU的内存带宽,或者你可以终止你的内核并开始一个新的内核。

__threadfence()而不是用于块之间的同步。 __threadfence()用于暂停当前线程,直到所有以前对共享和全局内存的写入都可以被其他线程看到。它不会停止也不会影响其他线程的位置!

您可以检查这些问题:

+0

感谢您的回答。但在我的问题中,只有一个块进程会生成一个全局结果,它在这个地方不理解函数threadfence。如果结果仅仅受到一个区块的影响,那么等待结果是不必要的。这种方法的原因是产生了最好的性能,因为调用内核是迭代的,应该分配内存。 – MariaDavila 2012-07-20 20:08:26

+0

@ CygnusX1:假设内核执行中的所有线程正在对全局内存执行一些写操作,并且我们不想继续进行,直到所有线程的所有写操作都可见。写入后所有线程都不会调用__threadfence()来确保同步? – 2013-05-14 21:05:05

+1

编号'__threadfence()'只保证*当前*线程不会继续,直到当前线程对全局内存的所有先前更改都可以被其他线程看到。然而,其他线程可能会尝试在发生之前从相同的存储单元中读取数据,读取旧数据并继续执行超过'__threadfence()'。 – CygnusX1 2013-05-14 22:08:34