我有以下情况:我已经编写了一些简短的MPI测试代码,以便找出哪些发送和接收操作组合在我的代码中最有效.
代码在我自己的计算机上运行得很好(用8个进程测试),但是只要我运行它一个我正在处理的集群,我得到一个损坏或双重释放指针的巨大错误输出,这是输出:http://pastebin.com/pXTRSf89
我在我的代码中做的是:我将通信功能调用100K次并测量时间.此功能如下所示.我发现的是,错误总是发生在同一次迭代中(大约6K左右).但报告的processorID确实发生了变化.即使我使用64个proc而不是8个,迭代也是一样的.问题是:我完全不知道,什么可能是错的,特别是因为没有指针被释放或分配.
void communicateGrid(int level, real* grid, const Subdomain& subdomain, std::vector<TimeMap>& tm_) {
tm_[level]["CommGrid"].start();
MPI_Status status[2];
MPI_Request request[2];
// x
MPI_Isend(&grid[getIndexInner(level, 1, 1, 1) + innerGridpoints_[level][0] - numOuterGridpoints_[level]], 1, mpiTypes_[level * 4 + 1], subdomain.upperNeighbors[0], 0, MPI_COMM_WORLD, &request[0]);
MPI_Isend(&grid[getIndexInner(level, 1, 1, 1)], 1, mpiTypes_[level * 4 + 1], subdomain.lowerNeighbors[0], 1, MPI_COMM_WORLD, &request[1]);
MPI_Recv(&grid[getIndexInner(level, 1,1,1) + innerGridpoints_[level][0]], 1, mpiTypes_[level * 4 + 1], subdomain.upperNeighbors[0], 1, MPI_COMM_WORLD, &status[0]);
MPI_Recv(&grid[getIndexInner(level, 1,1,1) - numOuterGridpoints_[level]], 1, mpiTypes_[level * 4 + 1], …Run Code Online (Sandbox Code Playgroud) 我必须将一些matlab代码重写为C,然后再使用MEX将其嵌入到Matlab中.到目前为止,我已经阅读了一些有关简单数据结构如何工作的教程和示例.(我之前从未这样做过,尽管我认为自己在Matlab和C方面都很有经验).
所以这是问题所在:
我已经给出了类似的东西
classdef MyClass
properties
foo;
bar;
blub;
somethingElse;
end
methods
function obj = myFun(obj) % really just some random example code
obj.foo = obj.bar;
obj.blub = 42;
for i = 1:length(obj.somethingElse)
obj.somethingElse(i) = i*i;
end;
end
end
end
Run Code Online (Sandbox Code Playgroud)
我想将myFun重写为MEX/C函数.如果我将类传递给MEX函数,我该如何访问该类的不同属性?
谢谢
我刚刚编写完一个 Linux 安全模块,该模块在可执行文件执行开始时验证其完整性(使用数字签名)。现在我想更深入地挖掘,并希望在运行时检查文件的完整性(即定期检查它们 - 因为我主要处理启动并永远运行的进程......),这样攻击者就不会能够在不被识别的情况下更改主内存中的文件(至少在一段时间后)。
这里的问题是我完全不知道如何检查文件的当前内存映像。我上面提到的身份验证方法使用了 mmap-hook,每当文件在执行之前进行 mmaped 时就会调用该钩子,但据我所知,LSM 框架不提供用于定期检查的工具。
所以我的问题是:有什么提示我应该如何开始吗?如何读取内存映像并检查其完整性?
谢谢
我编写了一个脚本,用于在二进制文件和脚本文件中存储数字签名.此问题仅针对脚本:目前,所有这些签名都存储在一行(注释)中,例如:
#!/usr/bin/perl
print "Hello"
print " World\n"
#Signature:ASDASG13412sdflsal4sf etc........
Run Code Online (Sandbox Code Playgroud)
例子是Perl,但这是针对所有脚本语言(Perl,Python,shell脚本等)完成的.所以现在我的问题是:如果包含签名的行的长度太长,我会遇到麻烦吗?口译员如何处理这个问题?如果是这样,最大值是多少.我可以用线长吗?
我在我的C++代码中使用OpenMP有一个非常奇怪的问题:
void update(double *source, double *target, int n)
{
target[0] = source[0];
target[n-1] = source[n-1];
#pragma omp parallel for
for(int i = 1; i < n-1; ++i)
target[i] = (1.0/3.0) * (source[i-1] + source[i] + source[i+1]);
}
Run Code Online (Sandbox Code Playgroud)
源和目标都是具有n个元素的双数组.在没有OpenMP的情况下使用它时,代码工作正常.但是一旦我使用pragma,代码就会陷入这个循环中.问题是:我绝对没有IDEA为什么.希望有人能帮助我
我正在寻找 MacOS 上 C++ 的代码分析/分析工具。我知道已经有关于这个线程的帖子,但是我需要的应用程序非常具体,所以也许有人可以给我一些更具体的建议。
所以这是我的问题:我正在用 C++ 编写科学代码(硕士项目),所以它是一个纯粹的控制台应用程序,没有给出交互性。该代码应该在大规模并行计算机上运行,因此我使用 MPI。然而,现在我还没有针对可扩展性进行优化,而只是针对单核性能进行优化。由于我不想将整个程序重写为串行程序,因此我只使用带有 1 个线程的 MPI。它工作得很好,但优化器显然需要能够处理这个问题。
我想分析什么?嗯,从某种意义上说,代码并不是很复杂,因为它有一个非常简单的结构,因此我需要的只是程序在某些函数上花费多长时间的列表,这样我就知道它在哪里损失了最多的时间,并且我可以测量我的优化速度加快了。
感谢所有的想法
我有一个理论问题.如您所知,对于缩放分析,加速定义为S(N)= T(1)/ T(N)其中T(i)是i处理器的运行时间.然后将效率定义为E(N)= S/N.这些定义对于强缩放非常有意义.
现在,我尝试计算程序的弱缩放效率.在这种情况下,会出现以下问题:这些公式对于弱缩放是无意义的.弱扩展意味着处理器上的工作负载相同,处理器数量增加(因此总问题大小也会增加).
使用上面的公式,一个完美的缩放程序将具有1的加速和1/N的效率 - 粗略的完全不直观.
将弱缩放效率定义为E(N)= S(1)/ S(N)似乎更合适.所以这是实际的问题:如何定义弱缩放效率?就像我说的那样会更有意义吗?
我试图找到它,但我得到的只是众所周知的公式,可能隐含地仅用于强缩放
我刚刚开始研究速度真正重要的科学项目(HPC).我目前正在设计数据结构.该项目的核心是双值的3D网格,以求解偏微分方程.
由于这里的速度可能比代码的简单性更大,我想知道STL与通常的C风格数组相比如何执行.在我的例子中,因为它是一个3D网格,我想到了a)带有线性索引的一维向量b)3个向量的向量或c)一维c样式数组或d)三维c样式阵列.
我查找了较旧的问题,但我只发现了构建/破坏的问题(这里不重要,因为数据结构只在程序启动时创建一次 - 快速索引和计算很重要)或不同STL容器的比较.
感谢帮助
这里有一个非常简单的问题,但我找不到答案:
假设我有一些条件条款由几个条件组成.比如像
if((a == b && strcmp(string1, string)) || x <= 5)
Run Code Online (Sandbox Code Playgroud)
我的问题是:无论第一个结果是什么结果,所有这些陈述都会被评估,或者一旦结果明确,评估就会停止.
由于我不确定我的问题是否清楚,这是一个例子:
if(a == 5 || b > 12 || (c = someFun()) == 3)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果a == 5,则不需要进一步检查,因为big语句的结果为TRUE,所以我们可以继续.这意味着不会评估someFun().
是这样的吗?我知道Java在&&和&resp之间有所不同.|| 和| (后者在C中无法提供),但我不知道C如何处理这个问题
我目前正试图弄清楚SUID位和相应的函数seteuid和geteuid是如何工作的.所以我写了这个小程序:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char **argv) {
printf("oldid %d\n", geteuid());
if(seteuid(0) == -1)
perror("seteuid faied");
printf("newid %d\n", geteuid());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译它,将其所有者更改为root,并将文件所有者的s位更改为:
[chris@myhost Test]$ ls -l test
-rwsr-xr-x 1 root root 4830 Apr 5 07:56 test
Run Code Online (Sandbox Code Playgroud)
但是产生的输出看起来像这样:
[chris@myhost Test]$ ./test
oldid 0
newid 0
Run Code Online (Sandbox Code Playgroud)
这是我不明白的事情.根据我发现的geteuid的第一次调用应该实际返回该程序的调用者的用户ID(即chris - 我的ID将是1000),但程序将root显示为有效用户id.任何人都可以解释为什么会这样吗?