MPI_Op_create:候选功能不可行.自定义结构指针不能解释为空指针
MPI_Op_create: candidate function not viable. Custom structure pointer cannot be interpreted as void pointer
我正在尝试使用MPI_Op_create()
来创建自己的约简,以便我可以为函数MPI_Allreduce()
传递自定义结构类型。例如,请参阅链接:http://www.netlib.org/utk/papers/mpi-book/node118.html
我定义的减少具有意义:
void reduction_op(data_t *in, data_t *inout, int *len, MPI_Datatype * datatype)
其中data_t是我的自定义结构的名称。如果我将reduction_op传递给MPI_OP_create()
,则会出现以下编译器错误:
kmeans_short.cpp:60:5: error: no matching function for call to 'MPI_Op_create'
MPI_Op_create(reduction_op, 1, &reduc_op);
^~~~~~~~~~~~~
/usr/local/include/mpi.h:1051:5: note: candidate function not viable: no known conversion from
'void (data_t *, data_t *, int *, MPI_Datatype *)' (aka 'void (data *, data *, int *, int
*)') to 'MPI_User_function *' (aka 'void (*)(void *, void *, int *, int *)') for 1st
argument
int MPI_Op_create(MPI_User_function *user_fn, int commute, MPI_Op *op) MPICH_API_PUBLIC;
^
1 error generated.
make: *** [kmeans] Error 1
有关玩具示例,请参见下文。我用mpicxx编译(我也尝试了mpicc和mpic++,但得到了同样的错误(。任何关于解决上述编译错误的帮助将不胜感激!
#include <iostream>
#include <stdlib.h>
#include <mpi.h>
#include <unistd.h>
#include <float.h>
#define N_DATA 1493
using namespace std;
#define FEATURES 8
typedef struct data{//Custom data structure for reduce operation
float feat[FEATURES];
long cluster;
} data_t;
void reduction_op(data_t *in, data_t *inout, int *len, MPI_Datatype * datatype){
data_t temp;
for(int i=0; i< *len; i++){
temp.cluster = in->cluster + inout->cluster;
for(int j=0; j<FEATURES; j++)
temp.feat[j] = in->feat[j] + inout->feat[j];
*inout = temp;
in++;
inout++;
}
}
int main(int argc, char * argv[]){
MPI_Init(&argc, &argv);
int n_data = 1493;
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int p_data = n_data/world_size; /*length of data per process*/
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
data_t data; data.feat[0] = 0.0; data.cluster = 0;
//mpi type for data_t
MPI_Datatype MPI_data_t;
int structlen = 2;
int blocklength[structlen];
MPI_Datatype type[structlen];
MPI_Aint displacement[structlen];
blocklength[0] = FEATURES; type[0] = MPI_FLOAT;
displacement[0] = (size_t)&(data.feat)-(size_t)&data;
blocklength[1] = 1; type[1] = MPI_LONG;
displacement[1] = (size_t)&(data.cluster) - (size_t)&data;
MPI_Type_create_struct(structlen, blocklength, displacement, type, &MPI_data_t);
MPI_Type_commit(&MPI_data_t);
//CUSTOM REDUCE FUNCTION FOR ALLREDUCE WITH MPI_data_t
MPI_Op reduc_op;
MPI_Op_create(reduction_op, 1, &reduc_op); //ERROR OCCURS HERE
MPI_Type_free(&MPI_data_t);
MPI_Finalize();
return 0;
}
你应该将函数声明 reduce_op
更改为
void reduction_op(void *in, void *inout, int *len, int* datatype)
然后重铸void* in
和void* inout
data_t
.基本上,您对reduction_op
的定义必须明确遵循MPI_User_function
的定义。
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 指针或结构的矢量
- MSVC将仅移动结构参数解释为指针
- 如何访问指针结构的成员变量?
- 如何将变量从变量传递到指针结构对象
- 如何在函数中检索指针结构
- C :变量的点地址至指针结构成员的地址
- C++指针结构不会被删除
- 初始化指针结构 - 内存中的外观
- C++指针结构和多线程
- c++中指针结构的运算符重载
- 为什么我不能转发声明指针结构?
- C# 如何定义新的指针结构
- 如何处理大型指针结构
- 我怎么能写一个函数的定义在模板类中声明返回指针结构对象
- 我如何编程指针结构或类变量在c++
- 具有指针结构的类所需的析构函数
- 为什么在非指针结构上进行类型转换会出现语法错误
- 语法:做binary_search (STL)排序向量的指针结构
- /a.检测到Glibc.out: munmap_chunk():无效指针- c++结构体的动态数组