您的位置:首页 > 办公文教 > 办公用纸 > 几个常用的数据定义函数

几个常用的数据定义函数

luyued 发布于 2011-05-01 22:47   浏览 N 次  
1. MPI_Type_contiguous

Syntax:

int MPI_Type_contiguous (
int count,
MPI_Datatype oldtype,
MPI_Datatype *newtype
)

Description:

old_type
->| |<-
+-----------------------------------+
| | | | | | | | | | | | |
+-----------------------------------+

| newtype |





2. MPI_Type_vector

Syntax:

int MPI_Type_vector (
int count, int block,
int strde,
MPI_Datatype oldtype,
MPI_Datatype *newtype
)

Description:
old_type
->| |<-
+-----------------------------------------------+
| | | | | | | | | | | | | | | | |
+-----------------------------------------------+
|--------------|---------|--------------|---------|
5 3 5 3
|---- data---|-stride--|---- data---|-stride-|
|-------- block --------|-------- block -------|

|<------------------ new_type ---------------|


3. MPI_Type_hvector

Syntax:

int MPI_Type_hvector (
int count,
int block,
MPI_Aint stride,
MPI_Datatype oldtype,
MPI_Datatype *newtype
)

Description:

the same as the MPI_Type_vector, the only difference is that the length of stride

in the MPI_Type_vector, the stride means stride x old_type Byte, but
in the MPI_Type_hvector, the stride means stride Byte.


4. C、Fortran语言对矩阵的读取方式

在构造数据类型的时候,应该深刻理解个语言的矩阵存储方式:
无论是C还是Fortran, 对矩阵的存储都是连续的,而对数据的读取也是顺序读取的。不同的是,C是一行一行的存储,而Fortran是一列一列的存储。这就导致了两种语言对矩阵的处理方式所不同。

C语言主行,也就是说,C语言矩阵默认以如下方式存储:

double a(M, N);

for (i = 0; i < M; i ++)
for (j = 0; j < N; j ++)
... a(i,j) ....

而fortran默认以如下方式存储:

real(8) :: a(M,N)

do j = 1, N
do i = 1, M
... a(i,j)

fortran 主列。


在Fortran中定义列向量:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

real :: a(100, 100)
integer :: f_col
mpi_type_contiguous (100, mpi_real, f_col)
mpi_send (a, 1, f_col, right, tag, mpi_comm_world)

! mpi_type_contiguous 定义了一个顺序读取和顺序存储的数据结构
! 用这个结构来对矩阵 a 进行读取操作,显然读取的是一列

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

在C中定义矩阵的一行



float a[100][100];
MPI_Datatype c_r;
MPI_Type_contiguous (100, MPI_FLOAT, &c_r);
MPI_Send (a, 1, c_r, right, tag, MPI_COMM_WOLRD)




5. MPI 对矩阵中数据的传输

问题:将矩阵的一列送到另一个数组的一行中:用MPI_Type_vector进行行列置换

...
double A[10][10]; // A 10x10
MPI_Datatype column_mpi_type;

MPI_Type_vector (
10, // 10 个块
1, // 每块一个 MPI_DOUBLE
9, // 然后是 9 个 MPI_DOUBLE 长度的空白
MPI_DOUBLE,
&column_mpi_type
);

MPI_Type_commit (&column_mpi_type);

if (rank == 0)
MPI_Send (
A,
1,
column_mpi_type,
1,
0,
MPI_COMM_WORLD
);
else
MPI_Recv (
A,
10,
MPI_FLOAT,
0,
0,
MPI_COMM_WORLD
);
....

这样,MPI_Type_vector 就定义了一个数据结构,其结构是这样的:

|| || || || || || || || || ||

当C在读取的时候,由于是矩阵A的数据结构顺序读取,所以其将第一块作为一行读入,第二块作为第二行读入...
到整个数据读入时候,正好填满 A矩阵,但除了一列数据外,其他都是空白。而这一列的首地址就是 &A[0][0]
广告赞助商