优化Vector元素使用CUDA交换

时间:2010-05-20 11:07:42

标签: optimization vector cuda swap

因为我是cuda的新手......我需要你的帮助 我有这个长矢量,对于每组24个元素,我需要做以下事情: 对于前12个元素,偶数元素乘以-1, 对于后12个元素,奇数元素乘以-1,然后进行以下交换:

图表:因为我还没有足够的积分,所以我无法发布图片,所以这里是:

http://www.freeimagehosting.net/image.php?e4b88fb666.png

我写了这段代码,想知道你是否可以帮我进一步优化它来解决分歧或银行冲突..

//subvector is a multiple of 24, Mds and Nds are shared memory

____shared____ double Mds[subVector];

____shared____ double Nds[subVector];

int tx = threadIdx.x;
int tx_mod = tx ^ 0x0001;
int  basex = __umul24(blockDim.x, blockIdx.x);

 Mds[tx] = M.elements[basex + tx];
__syncthreads();

// flip the signs 
 if (tx < (tx/24)*24 + 12)
 {  
    //if < 12 and even
    if ((tx & 0x0001)==0)
    Mds[tx] = -Mds[tx];
 }
 else
 if (tx < (tx/24)*24 + 24)
 {
    //if >12 and < 24 and odd
    if ((tx & 0x0001)==1)
    Mds[tx] = -Mds[tx];
 }

 __syncthreads();

 if (tx < (tx/24)*24 + 6)
 {  
//for the first 6 elements .. swap with last six in the 24elements group (see graph)
    Nds[tx] = Mds[tx_mod + 18];
    Mds [tx_mod + 18] = Mds [tx];
    Mds[tx] = Nds[tx];
 }
 else
 if (tx < (tx/24)*24 + 12)
 {
    // for the second 6 elements .. swp with next adjacent group (see graph)
    Nds[tx] = Mds[tx_mod + 6];
    Mds [tx_mod + 6] = Mds [tx];
    Mds[tx] = Nds[tx];
 }   
__syncthreads();

提前致谢..

1 个答案:

答案 0 :(得分:1)

保罗给你以前的问题提供了很好的起点。

需要注意的事情是:你正在做非基础2师,这是很昂贵的。 而是尝试利用线程块的多维性质。例如,制作尺寸为24的x维度,这将消除除法的需要。

通常,尝试拟合线程块尺寸以反映您的数据尺寸。

简化符号翻转:例如,如果您不想翻转符号,您仍然可以乘以身份1。弄清楚如何使用算术将偶数/奇数映射到1和-1:例如sign = (even*2+1) - 2,其中偶数为1或0。