- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个简单的例子来描述我的问题。我有一个包含动态数组的自定义结构
struct my_data_type {
int c;
int d[];
};
并且根进程(进程 0)有一个这样的结构数组 nums[4]
。
我想通过 MPI_Scatter
将数组的 block 发送到不同的进程(例如,2 个进程)。这里的主要问题是我希望这个数组 d[]
是动态的。
主要代码如下:
int main(int argc, char* argv[]) {
MPI_Init(NULL, NULL);
int my_size; MPI_Comm_size(MPI_COMM_WORLD, &my_size);
int my_rank; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
int len = 2; //example: the dynamic array d contains len=2 elements
my_data_type *nums //nums[4]
= (my_data_type*)malloc((sizeof(my_data_type) + sizeof(int) * len) * 4);
my_data_type *sub_nums //sub_nums[2]
= (my_data_type*)malloc((sizeof(my_data_type) + sizeof(int) * len) * 2);
if (my_rank == 0) { //just some examples
nums[0].c = 0; nums[1].c = 1; nums[2].c = 2; nums[3].c = 3;
nums[0].d[0] = 10; nums[1].d[0] = 11; nums[2].d[0] = 12; nums[3].d[0] = 13;
nums[0].d[1] = 14; nums[1].d[1] = 15; nums[2].d[1] = 16; nums[3].d[1] = 17;
}
MPI_Datatype mpi_data_type; //new datatype
int blocklens[2];
MPI_Datatype old_types[2];
MPI_Aint indices[2];
blocklens[0] = 1; blocklens[1] = len;
old_types[0] = MPI_INT; old_types[1] = MPI_INT;
MPI_Address(&nums[0].c, &indices[0]);
MPI_Address(&nums[0].d[0], &indices[1]);
indices[1] = indices[1] - indices[0];
indices[0] = 0;
MPI_Type_create_struct(2, blocklens, indices, old_types, &mpi_data_type);
MPI_Type_commit(&mpi_data_type);
MPI_Scatter(nums, 2, mpi_data_type,
sub_nums, 2, mpi_data_type,
0, MPI_COMM_WORLD);
cout << "rank " << my_rank << ": " << endl;
cout << "c: " << sub_nums[0].c << ", " << sub_nums[1].c << endl;
cout << "d: " << sub_nums[0].d[0] << ", " << sub_nums[0].d[1] << ", ";
cout << sub_nums[1].d[0] << ", " << sub_nums[1].d[1] << endl;
MPI_Finalize();
return 0;
}
如果我把struct my_data_type
定义中的int d[];
改成int d[2];
,我肯定会得到预期的结果,如
rank 0:
c: 0, 1
d: 10, 14, 11, 15
rank 1:
c: 2, 3
d: 12, 16, 13, 17
但如果不是,结果如下:
rank 0:
c: 0, 10
d: 10, 14, 14, 15
rank 1:
c: 33, 0
d: 0, 0, 0, 1
如您所见,我知道问题出在动态数组上,但我不能在我的项目中使用静态数组。那么我该如何更改上面的代码以获得预期的结果呢?
最佳答案
您的根本问题不是 mpi,而是使用具有灵活数组成员的结构数组。这是一个示例程序来说明问题
#include <assert.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct s s;
struct s
{
int c;
int d[];
};
int main(int argc, char* argv[])
{
assert(sizeof(s) == sizeof(int));
int len = 4;
s* okay = malloc(sizeof(*okay) + sizeof(int)*len);
intptr_t true_size = (intptr_t)&okay->d[len] -(intptr_t)(okay);
assert(true_size == ((len+1)*sizeof(int)));
int nbad = 6;
s* bad = malloc((sizeof(*bad) + sizeof(int)*len)*nbad);
intptr_t bad_size = (intptr_t)&bad[1] -(intptr_t)&bad[0];
/* this size mismatch means arrays of `s` do not do what you think they do */
assert(bad_size != true_size);
assert(bad_size == sizeof(int));
assert((char*)&bad[1] == (char*)&bad[0].d[0]);
assert((char*)&bad[2] == (char*)&bad[0].d[1]);
assert((char*)&bad[3] == (char*)&bad[0].d[2]);
assert((char*)&bad[1].d[0] == (char*)&bad[0].d[1]);
assert((char*)&bad[2].d[0] == (char*)&bad[0].d[2]);
assert((char*)&bad[3].d[0] == (char*)&bad[0].d[3]);
}
要处理具有灵活数组成员的结构数组,您需要手动计算索引的内存偏移量,而不是依赖编译器。所以你可以像这样定义一个辅助函数:
s* s_index(const s* a, int len, int index)
{
uintptr_t true_size = sizeof(*a) + len*sizeof(int);
return (s*)((char*)a + index * true_size);
}
然后使用s_index
访问所需的数组成员,而不是bad[0]
、bad[1]
构造:
s* first = s_index(bad, len, 0);
s* second = s_index(bad, len, 1);
assert((char*)&first->d[len] == (char *)second);
关于c - 如何使用 MPI 传递带有动态数组的自定义结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59947340/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!