是否有标准的memcpy版本?

问题描述:

我有一个10个元素长的列向量A.我有一个10乘10的矩阵B. B的存储器是列主要的。我愿与列向量A.覆盖第一 B中是否有标准的memcpy版本?

很显然,我可以这样做:

for (int i=0; i < 10; i++) 
{ 
    B[0 + 10 * i] = A[i]; 
} 

,我已经离开了零0 + 10 * i强调的是B使用列 - 主要存储(零是行索引)。

在CUDA-land今晚的一些诡计之后,我想到可能有一个CPU函数来执行一个strid memcpy?我想在低级别,性能将取决于存在一个strped的加载/存储指令,我不记得在x86汇编中存在?

+0

也许你应该考虑切换这个矩阵的存储策略,或者存储它的转置。 – 2011-05-16 06:46:03

简短的回答:你写的代码速度和它一样快。

长答案:memcpy函数是使用一些复杂的内部函数或程序集编写的,因为它对具有任意大小和对齐方式的内存操作数进行操作。如果你正在覆盖矩阵的一列,那么你的操作数就会自然对齐,并且你不需要使用相同的技巧来获得体面的速度。

+0

我想我只是希望汇编级访问能够为双通道和三通道内存说'un'-strided加载/存储指令。 – 2011-05-16 06:42:44

+0

我不确定'un-strided'加载/存储操作的含义。 – 2011-05-16 06:49:34

+0

也许我只是一个错误的看法,但我认为三通道RAM是通过地址空间进行分条的?如果我只能写入其中一个内存芯片(只能在一个通道中以较低的速度写入),这相当于一个间隔的memcpy?这当然很大程度上取决于条纹的粒度。 – 2011-05-16 06:55:19