来个编程过程中的小技巧

不知道大家有没有遇到这样的情况:

在某个迭代计算过程中,数组new的计算需要old的值,当计算完成后,需要把new的值写入old再下一次迭代?
如果这里使用memcpy的方式,当数据量较大的时候会很耗时的!

解决方法:交换指针

也就是把指向设备内存new和old的指针进行交换,这样就避免了memcpy的时间消耗~当然用过的人无视以上内容~

交换方法:定义一个函数
void pointerExch(void **pt1, void **pt2)
{
void *tmp;
tmp = *pt1;
*pt1 = *pt2;
*pt2 = tmp;
}

然后调用上面的函数,把保存指向设备的指针传入

pointerExch((void**)&new, (void**)&old);

这样new和old指向的位置就进行了交换,并且以前的代码也不需要修改!这样就代替了

cudaMemcpy(old, new, size, cudaMemcpyDeviceToDevice);

经实际测试,我有大概15个double的数组需要更新,每个都在10W个元素以上,如果用内存拷贝的方式,大概耗时在5ms,而用交换指针,只需要0.000007 s = 0.007ms就完成了!

善哉。

总版主大人威武87!千秋万代!一统江湖!

总版主威武:lol

:L我又不是练葵花宝典的!

只是衷心的赞美,我从来没想到可以用
tmp = p0;
p0 = p1;
p1 = tmp;
来实现交换的。

总版主这么做,真的是别处心裁,不拘一格。强烈要求在所有板块置顶。
不仅仅是学习这个实现。也是为了学习这种发散思维的精神。

这个也是在优化程序的过程中发现的~

:3_59:学习了,哈哈哈哈哈

这是个好方法

不错,确实很好,希望多多发布 小技巧

xiliful~
刚好我正在cudaMemcpy三维数组,一次迭代中cpy 好些个数组, 一共数千次迭代…
做CPU程序的时候还知道交换指针, 做CUDA就没意识了:L
多谢版主哈~

灰常好哈
学习啦