MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
MPI - How to create partial arrays for workers when array initialization value must be constant?
我目前对C++或MPI没有太多经验,所以我认为这将是一个容易回答的问题。
我希望能够更改可以出于实验目的对数组排序工作的进程数,但是当我尝试为我的工作线程声明一个部分数组时,我收到一个错误,指出数组大小变量 PART 需要是常量。
这是来自我计算或解析它的方式,还是来自 MPI 机制?
const int arraySize = 10000
int main(int argc, char ** argv)
{
MPI_Init(&argc, &argv);
int rank;
int size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
const int PART = floor(arraySize / size);
auto start = std::chrono::high_resolution_clock::now(); //start timer
//================================ WORKER PROCESSES ===============================
if (rank != 0)
{
int tmpArray[PART]; //HERE IS MY PROBLEM
MPI_Recv(&tmpArray, PART, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //recieve data into local initalized array
qsort(&tmpArray[0], PART, sizeof(int), compare); // quick sort
MPI_Send(&tmpArray, PART, MPI_INT, 0, 0, MPI_COMM_WORLD); //send sorted array back to rank 0
}
auto tmpArray = std::make_unique<int[]>(PART);
如果数组的大小是在运行时确定的,就像你的情况一样,这将给出一个可变长度的数组,它在 C 中受支持,但在标准C++中不受支持。因此,在C++中,数组的大小需要是一个(编译时(常量。
要解决此问题,您必须使用动态内存分配。这可以通过"经典 C"函数malloc
和free
(在C++中很少使用(,通过它们的C++挂new
和delete
(或new[]
和delete[]
(来实现,或者 - 首选方式 - 通过使用容器对象来实现,例如,std::vector<int>
为您封装此内存分配问题。
相关文章:
- 将返回值存储在函数指针数组的指针中是如何工作的?
- std::数组边界检查如何工作?
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么指针在对二维数组进行排序时无法正常工作?
- C++中循环和 C 样式数组的范围工作
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 为什么必须动态分配扩展数组才能使此功能正常工作C++
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- 将类型化数组写入子进程 stdin 无法正常工作
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- 如果带有字符数组的语句无法正常工作
- 使用 for 循环打印字符串数组无法正常工作 (C++)
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 澄清了 strcpy() 在像这样初始化字符数组时的工作 *Arr.
- 在 C++ 中使用递归填充 D2 数组,有时工作正常,其他时会引发异常
- 为什么C ,Devstudio,数组索引工作
- 构建对象数组是如何工作的?我被这个例子困住了
- 我怎样才能让这个多维数组工作
- 在glUniformMatrix4fv, c++中2d数组工作吗?