首页 理论教育 GPU与MATLAB混合编程:按列存储及其存储位置示例

GPU与MATLAB混合编程:按列存储及其存储位置示例

时间:2023-11-24 理论教育 版权反馈
【摘要】:遵从FORTRAN语言习惯,所有MATLAB数据都是按列的顺序存储的。为了对按列顺序存储有更好的理解,考虑下面3×4的矩阵:在存储器空间中,每个元素存储如下:在MATLAB命令窗口中,输入如下代码:在c-mex函数中,这个矩阵作为prhs中的一个实参进行传递。下面的范例展示了c-mex函数中二维数组的存储位置。一个简单数组传递给c-mex函数,对于单精度和字节数据类型,只需在MATLAB命令窗口中打印每个数组元素和它们相应的内存地址。

GPU与MATLAB混合编程:按列存储及其存储位置示例

遵从FORTRAN语言习惯,所有MATLAB数据都是按列的顺序存储的。在按列顺序中,每一列和其他列都是在存储位置连续依次存储的。为了对按列顺序存储有更好的理解,考虑下面3×4的矩阵

存储器空间中,每个元素存储如下:

在MATLAB命令窗口中,输入如下代码:

在c-mex函数中,这个矩阵作为prhs中的一个实参进行传递。假设这是第一个输入元素,我们把这个矩阵作为子例行程序的一块单精度数据,然后会得到如下指针

在C/C++语言中,索引从零开始 [1] ,使用指针运算可以访问每一个元素。为了得到数值10,可以采用如下语句:

通常,为了访问M×N二维矩阵中第m行第n列的元素,采用如下方式计算指针偏移量和进行访问:

对于M×N×P的三维数组,按如下方式访问第m行第n列第p页的元素

如你所见,当顺序访问存储器中的数据时,行指针比列指针变化更快。(www.xing528.com)

下面的范例展示了c-mex函数中二维数组的存储位置。一个简单数组传递给c-mex函数,对于单精度和字节数据类型,只需在MATLAB命令窗口中打印每个数组元素和它们相应的内存地址。

对于单精度数据类型:

你可以用范例column_major_single.m进行测试。)

注意,每个数据元素占用4字节,这是典型的单精度数据字节大小。

下面的范例给出了单字节数据类型,即8位无符号整数:

(你可以用范例column_major_uint8.m进行测试。)

可能你会注意到,对于单精度数据类型,内存地址一次增加4字节,而对于8位无符号整数,内存地址则一次增加1字节。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈