当奇数/偶数线程在CUDA中执行不同的操作时,优化代码性能

时间:2010-05-18 11:29:16

标签: performance optimization cuda

我有两个大向量,我正在尝试进行某种元素乘法,其中第一个向量中的偶数元素乘以第二个向量中的下一个奇数元素...并且其中奇数第一个向量中的编号元素乘以第二个向量中的前一个偶数元素。

例如:

矢量1是V1(1)V1(2)V1(3)V1(4)
向量2是V2(1)V2(2)V2(3)V2(4)
V1(1)* V2(2)
V1(3)* V2(4)
V1(2)* V2(1)
V1(4)* V2(3)

我已经编写了Cuda代码来执行此操作(Pds具有共享内存中第一个向量的元素,Nds是第二个向量):

// instead of % 2, checking the first bit to decide if a number
// is odd/even is faster 

if ((tx & 0x0001) == 0x0000)
    Nds[tx+1] = Pds[tx] * Nds[tx+1];
else
    Nds[tx-1] = Pds[tx] * Nds[tx-1];
__syncthreads();

是否有进一步加速此代码或避免分歧?

2 个答案:

答案 0 :(得分:6)

你应该能够消除这样的分支:

int tx_index = tx ^ 1; // equivalent to: tx_index = (tx & 1) ? tx - 1 : tx + 1
Nds[tx_index] = Pds[tx] * Nds[tx_index];

答案 1 :(得分:0)

这是一篇老帖子,可能有人发现我的答案有用。如果在你的代码中tx是threadIdx,那么你就有分支或扭曲分歧。您必须避免块中的分歧,因为它序列化了该过程。这意味着具有偶数索引的线程将首先运行,然后将运行具有奇数索引的线程。如果tx是threadIdx,请尝试更改算法,使分支取决于blockIdx。