- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我几乎完成了这个程序,我只需要循环某个部分很多次。目标是说如果“旧能量”在“新能量”的一定范围内(程序中的oldE vs E),那么循环将终止并打印新能量......也就是说,它是能源优化。现在我只是想循环它,所以我做了一个运行 3 次的 y 循环。但是,当我运行该程序时,它只是在终端中停止。我不确定是什么问题。我认为这与内存分配有关,所以我尝试释放内存并将其重新分配到看起来最合理的地方。
我标记为 //MAIN LOOP//
的靠近中间的区域是问题所在。如果尝试将那么多东西放入循环中似乎不合理,我该如何修改它,例如将它的 block 放入函数中?我尝试将 MPI 调用转换为函数,但这对我不起作用。
程序如下:
#include "stdio.h"
#include "stdlib.h"
#include "mpi.h"
#include "math.h"
#include "assert.h"
int main(int argc, char **argv) {
int N = 32;
int dim = 3;
float a = 10.0; // size of 3D box
int size, rank, i, j, k, q;
float **C, **Csend, **Crecv;
float rijx, rijy, rijz, rij, Vij, E, oldE;
float stepsize = 0.05;
double Start_time, End_time, Elapse_time;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Request requests[2];
float energies[size];
float calc_energy(float **matrix) {
E = 0;
for(i = 1; i < N-1; i++) {
for(j = i+1; j < N; j++) {
rijx = pow((matrix[i][0] - matrix[j][0]),2);
rijy = pow((matrix[i][1] - matrix[j][1]),2);
rijz = pow((matrix[i][2] - matrix[j][2]),2);
rij = pow((rijx + rijy + rijz),0.5);
Vij = pow((1/rij),12) - pow((1/rij),6);
E = E + Vij;
}
}
return E;
}
float **alloc_2d_float(int N, int dim) {
float *data = (float *)malloc(N*dim*sizeof(float));
float **array= (float **)malloc(N*sizeof(float*));
for(i=0; i<N; i++) {
array[i] = &(data[dim*i]);
}
return array;
}
Csend = alloc_2d_float(N,dim);
Crecv = alloc_2d_float(N,dim);
C = alloc_2d_float(N,dim);
if(rank==0){
for (i = 0; i < N; i++) {
for (j = 0; j < dim; j++) {
Csend[i][j] = (float)rand()/(float)(RAND_MAX/a);
}
}
}
// This function is to take a random number of matrix elements and change them slightly, but with a catch which is that it should be different for each processor.
float **randomsteps(float **matrix) {
float **newmatrix;
newmatrix = alloc_2d_float(N,dim);
for(i = 0; i < N; i = i++) {
for (j = 0; j < dim; j++) {
newmatrix[i][j] = matrix[i][j];
}
}
int n = rand()%dim;
for(i = 0; i < N; i = i+n) {
for (j = 0; j < dim; j++) {
int n = rand() % dim;
if(i%2 == 0) {
newmatrix[i][j] = matrix[i][j]+((rank+1)*stepsize);
if(newmatrix[i][j] > 10) {
newmatrix[i][j] = matrix[i][j] + (stepsize) - 10;
}
} else {
newmatrix[i][j] = matrix[i][j]-((rank+1)*stepsize);
if(newmatrix[i][j] < 0) {
newmatrix[i][j] = matrix[i][j] - (stepsize) + 10;
}
}
}
}
return newmatrix;
}
// MAIN LOOP //
int y; // var for big loop
for(y=0;y<3;y++) {
for (i = 1; i < size; i++) {
if (rank == 0) {
MPI_Send(&(Csend[0][0]), N*dim, MPI_FLOAT, i, 10+i, MPI_COMM_WORLD);
}
if (rank == i) {
MPI_Recv(&(Crecv[0][0]), N*dim, MPI_FLOAT, 0, 10+i, MPI_COMM_WORLD, &status);
}
}
if(rank==0){
C = randomsteps(Csend);
E = calc_energy(C);
oldE = calc_energy(C);
energies[0]=E;
} else {
C = randomsteps(Crecv);
E = calc_energy(C);
}
MPI_Barrier(MPI_COMM_WORLD);
for (i = 1; i < size; i++) {
if (rank == i) {
MPI_Send(&E, 1, MPI_FLOAT, 0, 10+i, MPI_COMM_WORLD);
}
if (rank == 0) {
MPI_Recv(&energies[i], size-1, MPI_FLOAT, i, 10+i, MPI_COMM_WORLD, &status);
}
}
MPI_Barrier(MPI_COMM_WORLD);
int location;
int findmin(float *energies) {
int location = 1;
float minimum = energies[0];
for (i = 1 ; i < size ; i++ ) {
if ( energies[i] < minimum ) {
minimum = energies[i];
location = i;
}
}
return location;
}
if(rank==0){
location = findmin(energies);
}
MPI_Bcast(&location, 1, MPI_FLOAT, 0, MPI_COMM_WORLD);
if(rank==0){
MPI_Recv(&(C[0][0]), N*dim, MPI_FLOAT, location, 1, MPI_COMM_WORLD, &status);
}
if(rank == location){
MPI_Send(&(C[0][0]), N*dim, MPI_FLOAT, 0, 1, MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
if(rank==0){
printf("%f\n",calc_energy(C));
free(Csend);
Csend = alloc_2d_float(N,dim);
for(i=0;i<N;i++){
for(j=0;j<dim;j++){
Csend[i][j] = C[i][j];
}}
}
MPI_Barrier(MPI_COMM_WORLD);
free(C);
free(Crecv);
C = alloc_2d_float(N,dim);
Crecv = alloc_2d_float(N,dim);
MPI_Barrier(MPI_COMM_WORLD);
}
//END MAIN LOOP
free(C);
free(Csend);
free(Crecv);
MPI_Finalize();
return 0;
}
代码有效,除了那个大的 y 循环。如果你只是摆脱它,它会打印一个值。
预先感谢您的帮助!
编辑:我尝试打印出一堆语句,但似乎卡在了这一点上:
if(rank==0){
C = randomsteps(Csend);
E = calc_energy(C);
oldE = calc_energy(C);
energies[0]=E;
if(y==1){
printf("yummy");
}
} else{
C = randomsteps(Crecv);
E = calc_energy(C);
if(y==1){
printf("yummy");
}
}
它夹在美味之间
edit2:更具体地说,它似乎是 C = randomsteps(Crecv);
这就是问题所在
edit3:并在 randomsteps 中注释这段代码可以解决这个问题,所以这似乎是原因所在。仍在尝试找出原因
int n = rand()%dim;
for(i = 0; i < N; i = i+n) {
for (j = 0; j < dim; j++) {
int n = rand() % dim;
if(i%2 == 0) {
newmatrix[i][j] = matrix[i][j]+((rank+1)*stepsize);
if(newmatrix[i][j] > 10) {
newmatrix[i][j] = matrix[i][j] + (stepsize) - 10;
}
} else {
newmatrix[i][j] = matrix[i][j]-((rank+1)*stepsize);
if(newmatrix[i][j] < 0) {
newmatrix[i][j] = matrix[i][j] - (stepsize) + 10;
}
}
}
}
该代码试图获取矩阵中的随机元素,并针对每个处理器略微且唯一地修改它们的值(例如,按 0.05*rank)
edit4:aaaand 我想通了。我只需要将 int n = rand() % dim;
中的 dim
切换为 N
。一个愚蠢的打字错误让我 panic 了三个小时。 -_-
也许我现在应该删除这篇文章?还是会被关闭?我不确定在这种情况下会做什么
最佳答案
你的程序挂起只是因为你陷入了死锁。
发生这种情况是因为您的发送/接收不平衡,以您的第一个循环为例:
for (i = 1; i < size; i++) {
if (rank == 0) {
MPI_Send(&(Csend[0][0]), N*dim, MPI_FLOAT, i, 10+i, MPI_COMM_WORLD);
}
if (rank == i) {
MPI_Recv(&(Crecv[0][0]), N*dim, MPI_FLOAT, 0, 10+i, MPI_COMM_WORLD, &status);
}
}
Rank #0 执行 size
MPI_Send 操作,每个其他进程一个排名 #1-N 每个 size
MPI_Recv(因此 (N-1)*size recvs 待处理)!这些 size
接收中只有 1 个将被排名 0 匹配!
因此,虽然 Rank 0 可以继续执行剩余的代码,但所有其他进程都停留在接收上。当 Rank #0 稍后击中障碍时,您将陷入僵局。
你要做的是:
if (rank == 0) {
for (i = 1; i < size; i++)
MPI_Send(&(Csend[0][0]), N*dim, MPI_FLOAT, i, 10+i, MPI_COMM_WORLD);
}
if (rank == i) {
MPI_Recv(&(Crecv[0][0]), N*dim, MPI_FLOAT, 0, 10+i, MPI_COMM_WORLD, &status);
}
还要相应地更改循环结束时的发送/接收代码。
关于c - 我如何循环这些 MPI 调用,或者为了清洁起见,将它们转换为函数并循环函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816397/
我对 unix 套接字(TCP 本地)有点困惑 我有一个服务器和一个客户端: client 通过套接字向服务器发送一些信息(使用send)多次 server 打印此数据(server 调用 recv
我一直在尝试从数据集中清理特定列。我多次使用 .apply() 函数以便抛出任何可能出现在列的字符串值中的符号。 对于每个符号,函数如下:.apply(lambda x: x.replace("",
我正在按照 http://nvie.com/posts/a-successful-git-branching-model/ 的建议进行独立项目 我使用以下代码发布了我的代码的版本 1: git che
我一直在尝试从数据集中清理特定列。我多次使用 .apply() 函数以便抛出任何可能出现在列的字符串值中的符号。 对于每个符号,函数如下:.apply(lambda x: x.replace("",
我正在按照 http://nvie.com/posts/a-successful-git-branching-model/ 的建议进行独立项目 我使用以下代码发布了我的代码的版本 1: git che
我想让我的 Controller 变薄,并将业务逻辑与其他操作分开。例如我有一个 Action : public function indexAction() { $languages = $
如何清理 react native 项目? 有什么方法可以像我们可以清理 xcode 项目一样清理 React Native 项目? 任何帮助将不胜感激! 最佳答案 一个 react-native 项
我创建了一组 jRadioButton, 每个按钮都有一个操作监听器,用于在单独的窗口中创建 JTable。 我希望当我按下另一个按钮时,框架将被清理,然后执行另一个JTable, ButtonGro
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this q
我有几项任务要在不共享数据的 AWS EMR 上执行,我想使用同一个 EMR 一个接一个地执行它们。有没有办法将正在运行的 EMR 清理回其初始状态(删除配置单元表,清理所有 HDFS 文件等)避免数
更新 bundle 后,您将拥有一些可能已过时的 gem——因为已安装该 gem 的更新版本。 bundle 可执行文件下没有这样的命令,即 bundle clean。如何摆脱这些过时的 gem ?
当我从命令提示符运行“mvn clean tomcat:run”(未指定任何 tomcat 版本)命令以运行我的 Web 应用程序时,它会下载 tomcat 6.0.29 版本依赖项,如下所示: 组织
我可以在我的 iOS 应用程序中使用干净的 c++ 版本的 openGL 吗?我想写一些基本的包装器,然后将我的 C++ 代码与这个包装器和 App 连接起来。或者我必须只使用 openGLES?使用
我是 Apache/mod_rewrite 的新手。我需要这样做 以下网址: http://www.example.com/applications/seo-friendly-text-for-app
有人能告诉我什么是清理不良 HTML 以便 BeautifulSoup 可以处理它的更好方法 - 应该使用 BeautifulSoup 的按摩方法还是使用正则表达式清理它? 最佳答案 我想我应该改写我
假设我有一个 Controller ,其中包含一个呈现 View 的操作。 View 需要数据来呈现。我知道以下方法来准备并将其发送到 View : 使用实例变量 class CitiesContro
我的 ASP.NET MVC 项目已推送到 Azure 网站,其中包含无效的额外 DLL。这导致项目无法正常运行。如果创建了一个新网站,它会完美运行。在本地清理项目并重新部署并不能解决问题。有没有办法
我尝试了很多变体,但无法实现此目的。一个示例(子 pom.xml): org.apache.maven.plugins maven-clean-plugin
我有一些关于 Vaadin 架构的简单问题。 Vaadin 文档声称它是一个 Single-Page Application (SPA)但是这怎么可能呢,因为页面是在服务器端渲染的,到处都是一些 Ja
我的 Dockerfile 看起来像 FROM python:3.7-slim # System setup ENV USER app ENV APP_DIR /home/app RUN userad
我是一名优秀的程序员,十分优秀!