Feb 262015
 
This entry is part 13 of 13 in the series Matlab基础班附加材料

今天在Matlab调用OpenCL然后发现一个不常见的问题。当时是为了比较OpenCL计算精度和Matlab计算精度的差异。程序流程是:

在Matlab中生成一个随机矩阵, in1, 顺道把这个矩阵保存一份为 in1bak;
调用OpenCL,对这个矩阵做一些运算,返回的结果还是存放在 in1矩阵中;
最后在Matlab中用in1bak,做一些计算,用得到的结果与in1矩阵作对比。

遇到的诡异问题是: in1bak本来应该是储存in1矩阵的原始数值,但是调用OpenCL后,in1里面已经是计算后的数据,但是in1bak同时变为最新的in1矩阵的数据了。

问题起源是,我所用的 OpenCL Wrapper 所调用 kernel 的 run() 函数里面,是将返回结果直接写入到 in1 矩阵的内存空间中。而Matlab中,如果是简单的赋值操作,例如这里的 in1bak=in1,则默认上只是做了一个 link, 即将in1bak指向 in1 矩阵在内存中所存储的空间而已,并不是将 in1 的值复制一遍然后保存为 in1bak 变量。在OpenCL Wrapper 直接修改 in1 矩阵内存空间的数值后, Matlab并不会意识到 in1 已经出现变化,于是也不会将 in1bak 独立出来区分 in1 变量。

要解决这个问题,我所认为的最简单的办法,就是在调用 OpenCL 前, 对in1或者in1bak做一点点”操作“,让Matlab意识到in1bak与in1不同,于是会将in1的数值全部复制出来到in1bak中。
这个简单的操作可以有很多选择,我所选择的是: in1(1)=in1(1)+0;

结论(或经验): 如果知道某个变量可能会遇到被外部程序直接修改内存空间的操作,那么可以先对这个变量做一些trivial的操作,从而让Matlab将那些仅仅只是“映射”其数值的变量都拷贝出去。

------------------

这个原理在Matlab中叫做:Copy on Write mechanism

implements an automatic copy-on-write (sometimes called copy-on-update or lazy copying) mechanism, which transparently allocates a temporary copy of the data only when it sees that the input data is modified. This improves run-time performance by delaying actual memory block allocation until absolutely necessary. COW has two variants: during regular variable copy operations, and when passing data as input parameters into a function:

No related posts.

Series Navigation<< 从Matlab调用Excel中的宏过程
Bookmark/FavoritesSina WeiboGoogle+FacebookQQTwitterYahoo BookmarksBaiduDiggEmailGoogle GmailOutlook.comEvernotePrintAIMLinkedInBlogger PostKindle ItShare

Related Posts:

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>