- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用 MPI_Allgather()
向所有进程发送一个结构。我似乎没有收到任何明显的错误,但是代码不起作用。当我检查我是否在 recv[]
中收到任何值时,它显示没有。如果我只发送一个变量而不是使用类似代码的结构,那是可行的,所以我不确定发生了什么。该结构具有静态数组,因此内存应该是连续的,或者我应该使用 MPI_Pack
还是什么?这是代码:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define NUMEL 21
struct mystruct{
int sendarray[10];
int a;
char array2[10];
};
typedef struct mystruct struct_t;
int main (int argc, char ** argv)
{
MPI_Status status;
int rank, size;
char *recv;
int i, j;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// init
struct_t * fd = (struct_t*)malloc(sizeof(*fd));;
for (i=0;i<10;i++){
fd->sendarray[i] = 0;
fd->array2[i] = 0;
}
recv = (char *) malloc ( size*NUMEL);
// put some stuff in your array
for (i=0;i<size;i++){
if(rank == i){
fd->sendarray[i] = i *10;
fd->array2[i] = i *20;
fd->a = rank;
}
if(fd->sendarray[i] != 0)
printf("My rank is %d, fd->sendarray[%d] is %d\n", rank, i, fd->sendarray[i]);
}
// gather data from all now..
MPI_Allgather (fd, NUMEL, MPI_BYTE, recv, NUMEL * size, MPI_INT, MPI_COMM_WORLD);
// check if correct data has been received
for (i=0;i<size*NUMEL;i++){
if(recv[i] != 0)
printf("My rank is %d and recv[i]=%d and i is %d\n", rank, recv[i],i);
}
MPI_Finalize();
}
最佳答案
第一次看到 Allgather 时可能会有些困惑。这里发生了一些事情。
首先,要收集的计数——发送计数和接收计数——是每个进程发送的数据量,以及从每个进程接收的数据量.
其次,allgather 的工作方式是连接发送的数据。所以如果你有
int send[3];
int recv[9];
每个进程的发送数组如下所示:
send:
+---+---+---+
| 0 | 0 | 0 | rank 0
+---+---+---+
+---+---+---+
| 1 | 1 | 1 | rank 1
+---+---+---+
+---+---+---+
| 2 | 2 | 2 | rank 2
+---+---+---+
然后调用
MPI_Allgather(send, 3, MPI_INT, recv, 3, MPI_INT, MPI_COMM_WORLD);
会导致:
recv:
+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
+---+---+---+---+---+---+---+---+---+
因此,提取正确数据的代码版本是:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
struct mystruct{
int sendarray[10];
int a;
char array2[10];
};
typedef struct mystruct struct_t;
int main (int argc, char ** argv)
{
int rank, size;
struct_t *recv;
int i, j;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// init
struct_t * fd = (struct_t*)malloc(sizeof(*fd));
for (i=0;i<10;i++){
fd->sendarray[i] = 0;
fd->array2[i] = 0;
}
recv = malloc ( size * sizeof(*fd) );
// put some stuff in your array
fd->sendarray[rank] = rank*10;
fd->array2[rank] = rank*20;
fd->a = rank;
printf("My rank is %d, fd->sendarray[%d] is %d\n", rank, i, fd->sendarray[i]);
// gather data from all now..
MPI_Allgather (fd, sizeof(*fd), MPI_BYTE, recv, sizeof(*fd), MPI_BYTE, MPI_COMM_WORLD);
// check if correct data has been received
if (rank == 0) {
printf("Received:\n");
for (i=0;i<size;i++){
printf("---\n");
printf("int array: ");
for (j=0; j<10; j++) printf("%3d ", recv[i].sendarray[j]);
printf("\nint: "); printf("%3d\n", recv[i].a);
printf("char array: ");
for (j=0; j<10; j++) printf("%3d ", (int)(recv[i].array2[j]));
printf("\n");
}
}
MPI_Finalize();
return 0;
}
请注意,它将这些结构收集到相当于这些结构的数组中。使用 4 个处理器运行可以得到:
My rank is 0, fd->sendarray[10] is 0
My rank is 1, fd->sendarray[10] is 1
My rank is 2, fd->sendarray[10] is 2
My rank is 3, fd->sendarray[10] is 3
Received:
---
int array: 0 0 0 0 0 0 0 0 0 0
int: 0
char array: 0 0 0 0 0 0 0 0 0 0
---
int array: 0 10 0 0 0 0 0 0 0 0
int: 1
char array: 0 20 0 0 0 0 0 0 0 0
---
int array: 0 0 20 0 0 0 0 0 0 0
int: 2
char array: 0 0 40 0 0 0 0 0 0 0
---
int array: 0 0 0 30 0 0 0 0 0 0
int: 3
char array: 0 0 0 60 0 0 0 0 0 0
如果您真的只想收集相应的元素,那么您只需从结构中的特定位置发送一个 int/char 即可:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
struct mystruct{
int sendarray[10];
int a;
char array2[10];
};
typedef struct mystruct struct_t;
int main (int argc, char ** argv)
{
int rank, size;
struct_t fd;
struct_t recv;
int i, j;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// init
for (i=0;i<10;i++){
fd.sendarray[i] = 0;
fd.array2[i] = 0;
recv.sendarray[i] =999;
recv.array2[i] = 99;
}
recv.a =999;
// put some stuff in your array
fd.sendarray[rank] = rank*10;
fd.array2[rank] = (char)(rank*20);
fd.a = rank;
printf("My rank is %d, fd.sendarray[%d] is %d\n", rank, rank, fd.sendarray[rank]);
// gather data from all now.. send the int:
MPI_Allgather (&(fd.sendarray[rank]), 1, MPI_INT, recv.sendarray, 1, MPI_INT, MPI_COMM_WORLD);
// then the char
MPI_Allgather (&(fd.array2[rank]), 1, MPI_CHAR, recv.array2, 1, MPI_CHAR, MPI_COMM_WORLD);
// check if correct data has been received
if (rank == 0) {
printf("Received:\n");
printf("---\n");
printf("int array: ");
for (j=0; j<10; j++) printf("%3d ", recv.sendarray[j]);
printf("\nint: "); printf("%3d\n", recv.a);
printf("char array: ");
for (j=0; j<10; j++) printf("%3d ", (int)(recv.array2[j]));
printf("\n");
}
MPI_Finalize();
return 0;
}
如果我们用 4 个进程运行它,我们会得到:
My rank is 0, fd.sendarray[0] is 0
My rank is 1, fd.sendarray[1] is 10
My rank is 2, fd.sendarray[2] is 20
My rank is 3, fd.sendarray[3] is 30
Received:
---
int array: 0 10 20 30 999 999 999 999 999 999
int: 999
char array: 0 20 40 60 99 99 99 99 99 99
关于c - 使用 MPI_Allgather 分发结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603750/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!