数组的快速赋值问题

1.在C语言中有没有数组的快速赋值方法?不用for循环,因为我的元素大部分都是0,只有矩阵对角线才有数值。
2.CUDA中有快速给数组赋值的方法吗?

cudamemset

“快速”可以从两个方面说。

一是对编写者来说的,能减少源代码行数,减少敲入的字符数,即为快速。例如我们常用的int d[…] = {0};。这个在不同的平台/OS下,可能会被编译为memset, 也可能会直接利用OS的虚拟内存/loader支持,作为在可执行映像里的未初始化数据段之类的存在。

二是对代码执行速度来说的,能快速的对指定区域填充上指定的内容,即为快速。

从楼主的角度来说,如果想快速初始化”一个大部分元素是0,对角线元素是其他值“的一个"数组", 可以简单的对大数组memset清零,然后对对角线元素赋值来实现。

但这个简单的,朴素的方法,不是“快速”的,至少从上文的对 “快速”的第二个理解角度来说。

而我建议楼主,既然绝大部分元素都是0,那么不妨看成一个稀疏的矩阵,而不是简单的“数组”存储,此时,就可以简单的快速的处理了,无论从存储空间还是访问速度来说。

举个简单的例子来说,你可以写个简单的对某阵的读取wrapper, 其内部只存储对角线上的元素,例如作为一个一维数组,然后将对(x,y)元素的读取,映射为读取这个一维数组的(n)处的值,以及映射为0。这样存储(例如初始化值)和读取的过程都大大方便了,快速了。

稍微补充下3#横扫版主的最后那个说法,这是稀疏阵的方法,但是这样用,您的其他kernel(按照您之前帖子里面给出的)里面按照稠密阵存储方法写的部分,也需要做相应的转换。

祝您编码愉快~

好的,我再看看哈~

我说的快速是计算速度快,也就是您提到的第二点,我有两点疑问:
一.我的数组是double型,我记得memset好像是针对char类型的吧?
二.memset 网上有帖子说内部其实也是for循环,只不过是隐式的而已,那这样的话它的速度会快吗?

对照3#横扫斑竹的说法,您在这里有点穿越了,亲~

横扫的说法是,要计算快速,请用稀疏阵;要写程序快速,请用memset清零,然后给对角线附近赋值。

所以,按照此思路,要计算快速的话,其实和memset没啥关系的。

当然,也不妨大致说下memset。
无论您的数组是float还是double,如果将每个字节都写为全零的话,作为对应的4字节或8字节浮点数,按照IEEE754标准,他们依然表示浮点的零。所以这样清零是没有问题的,细节请LZ自行考证下。

至于memset具体的实现,这个我不懂,有待其他人补充。不过至少写起来比for循环省事很多。

祝您编码愉快。

memset处理的对象是“字节”吧?如果是int或者别的类型,还得计算是多少byte

是的,一般是这样的。:slight_smile:

祝您编码愉快~

好的,O(∩_∩)O谢谢!