我们知道 Linux 内核是用 C 编写的。但它是否也调用了标准 C 函数,malloc()或者像mmap()GNU C 库(glibc)提供的额外函数?在那种情况下,这很奇怪,因为与硬件的直接低级交互,例如内存管理,应该几乎总是内核的任务。那么,哪个依赖于另一个?哪个更基本/低级?
有什么充分的理由选择
MPI_Abort(MPI_COMM_WORLD, MY_ERROR_CODE);
Run Code Online (Sandbox Code Playgroud)
到
exit(MY_ERROR_CODE);
Run Code Online (Sandbox Code Playgroud)
在用 C 编写的基于 MPI 的并行代码中?到目前为止我从未使用过前者。
据我所知,如果要进行缓冲通信,则必须由进程调用 MPI_BUFFER_ATTACH。但这是否也包括标准的 MPI_SEND ?我们知道 MPI_SEND 可能表现为同步发送或缓冲发送。
例如,假设表达式sys->pot.atoms[item->P.kind].mass在循环内计算。循环只改变item,所以表达式可以简化为在循环之前atoms[item->P.kind].mass定义一个变量atoms = sys->pot.atoms。像 gcc 这样的现代编译器是否会自动执行这种优化(如果启用了优化)?无论atoms[item->P.kind].mass循环中存在的表达式数量如何,它都可靠吗?
在进行文件 I/O 时,我应该bool像对待变量一样对待变量吗?
我的意思是使用以下代码片段是否正确?int
bool b = true;
FILE *fp1, *fp2;
...
fprintf(fp1, "%d", b);
fscanf(fp2, "%d", &b);
Run Code Online (Sandbox Code Playgroud)
我想知道基于 ISO C 规范的答案。
假设最接近 double 值的浮点值d是f1and f2,因此f1< d< f2。d在 C99中强制转换为 float的结果是什么?f1或者f2?考虑以下两种情况:
d - f1 > f2 - dd - f1 < f2 - d我假设 d 本身不能由任何浮点值精确表示。
假设您选择了最有效的算法来解决性能优先的问题,现在您正在实施它,您必须决定如下细节:
v[i*3+0],v[i*3+1]并v[i*3+2]包含粒子速度的分量i,我们要计算总动能。假设所有粒子都具有相同的质量,人们可以写:
inline double sqr(double x)
{
return x*x;
}
double get_kinetic_energy(double v[], int n)
{
double sum = 0.0;
for (int i=0; i < n; i++)
sum += sqr(v[i*3+0]) + sqr(v[i*3+1]) + sqr(v[i*3+2]);
return 0.5 * mass * sum;
}
Run Code Online (Sandbox Code Playgroud)
为了减少乘法次数,可以写成:
double get_kinetic_energy(double v[], int n)
{
double sum = 0.0;
for (int i=0; i < n; i++)
{
double *w = v + i*3;
sum += sqr(w[0]) + sqr(w[1]) + sqr(w[2]); …Run Code Online (Sandbox Code Playgroud) 在C中,fscanf()不一定从第一个字节读取文件; 它从当前访问位置读取文件.我需要一个sscanf()与字符串相同的版本.是否有任何功能(标准或非标准)用于此目的?
更新:似乎我没有很好地提出这个问题.我不知道这种sscanf()应该开始读取的地方/偏移的数值; 我想让它从之前调用它的地方读完.谢谢.
我的C程序在内存中存储许多整数值,并读取它们并经常对其进行比较。类型的范围unsigned char是足够的,但是我使用它int是因为速度对我来说比内存消耗重要得多,而且我认为CPU的工作int速度可能更快。但这只是直觉的粗略猜测,我不确定。
c ×8
mpi ×2
optimization ×2
abort ×1
c11 ×1
casting ×1
gcc ×1
glibc ×1
linux ×1
linux-kernel ×1
performance ×1