2014-04-07 17 views
0

我想设计一个CUDA内核,该线程块在线程中可以读取自己的一维数组。假设一个有两个线程的线程块需要两个数组{1,2,3,4}和{2,4,6,8}。然后,每个warps将通过读取自己的数组来执行一些计算。计算是基于每个数组元素来完成的。这意味着线程块会对阵列中的元素2和4进行冗余计算。 这是我的问题:我如何避免这种多余的计算?有没有办法避免部分重叠阵列上的线程块中的扭曲进行冗余计算

准确地说,我希望做一个经跳过元素的计算,一旦元素已被其他经线被已经谈到,否则计算正常去,因为任何经线从未触及的元素。

使用在专用到一个线程块的共享存储器中的哈希表可以被考虑。但是我担心由于哈希表访问每当一个数组的warp访问元素时性能下降。

任何想法或意见?

+0

你将不得不更好地解释这一点。为什么这意味着“线程块会对阵列中的元素2和4进行冗余计算”? – talonmies

回答

1

在许多核协处理器并行计算,期望在一个独立的数据集执行算术运算,即,以消除对集您提供给线程/经线载体中的任何种类的依赖。这样,计算可以并行运行。如果您想跟踪之前计算过的元素(在这种情况下,两个输入数组中常见2和4),则必须序列化并创建分支,这反过来会降低计算性能。

总之,你需要检查是否有可能通过减少输入向量那些具有不同的组件,以消除在输入级的冗余。如果不是,跳过重复组件的冗余计算可能不一定会提高性能,因为计算是批量执行的。

0

让我们尝试了解硬件级别会发生什么。

首先,CUDA中的计算通过warp发生。一个warp是一组32个线程,它们彼此同步。指令在同一时刻在相应的warp的所有线程上执行。所以从技术上讲,它不是线程,而是最终在硬件上执行的warps。

现在,让我们假设,不知怎的,你可以跟踪哪些所以你把一个条件在内核像

... 
if(computationNeeded){ 
    compute(); 
} 
else{ 
    ... 
} 
... 

现在的元素并不需要计算让我们假设有5个线程“computNeeded”为false的特定warp并且不需要计算。但根据我们的定义,所有线程都执行相同的指令。所以即使你把这些条件放在所有线程都必须执行if和else块。

例外: 它会更快如果任一如果或其他条件的特定块的所有线程执行。但它几乎适用于所有现实世界的算法。

建议 把一个预处理步骤无论是在CPU或GPU,其消除来自输入数据的冗余元件。另外,检查这一步是否值得。

准确地说,我希望做一个经跳过元素的计算,一旦元素已被其他经线被已经谈到,否则计算正常去,因为任何经线从未触及的元素。

使用专用成线程块。如果你想在网格的所有的经纱之间的经间通信 可考虑

上的共享内存的哈希表,则仅可以通过全局内存不共享内存。