几个常用的数据定义函数
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]
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]
相关资讯
- 06-04· 如家七斗星商旅国贸店-南
- 06-03· 金太阳认证
- 06-03· 远望
- 05-31· 本全场简介
- 05-31· 新汕大图书馆
- 05-28· 什么是佳印名片设计器
- 05-28· 免费名片设计软件淘宝网
- 05-28· 佳印网 牛刀小试
- 05-27· 《今日海阳》架起与家乡
- 05-27· 即墨海阳跨海大桥
最新资讯
- 05-27· [2010-11-11]富洲艾森娜庄园
- 05-27· 第一次登顶珠峰(上)|
- 05-27· 奥园五期--富洲新城水电图
- 05-27· 富洲新城首期“国际专家
- 05-27· 富洲周边搜食记
- 05-27· 富洲酒店
- 05-27· 南昌富洲饭店保安部经理
- 05-27· 泽州东阐方村 养母与脑瘫
- 05-26· 2011-01-14
- 05-26· 2009-09-04