标签: gnu

在 C 中使用 drand48_r 作为随机数生成器

所以我一直在用 C 编写一些应用程序并使用 OpenMP 进行并行化。我实现了 Monte-Carlo Pi 估计,发现正常的 rand() 函数不是可重入和线程安全的。建议使用 drand48_r 选项。

现在问题来了,我的应用程序在 Linux 上编译得很好,例如。Ubuntu、Fedora 和 CentOS 但不能在 Mac OS X 上编译。 OS X 上的编译错误是。

simple.c:7: 错误:“randBuffer”的存储大小未知

用作简单示例的代码是:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {

  double x;
  struct drand48_data randBuffer;

  srand48_r(time(NULL), &randBuffer);

  drand48_r(&randBuffer, &x);

  printf("Random number: %f\n", x);

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我阅读了它,并在手册页中找到了一条说明,

这些函数是 GNU 扩展,不可移植。

这是它的链接:http : //www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html

所以我有很多问题;

  1. 什么是 GNU 扩展以及是什么使它不可移植?
  2. 在也是线程安全的 OS X 上生成随机数有哪些替代方法?

嗯,就是这样。

该示例使用 gcc 编译为,

gcc simple.c -o simple

c random macos gnu openmp

2
推荐指数
1
解决办法
9715
查看次数

GNU sort - 用于比较的默认算法是什么?

我需要帮助理解 GNU 排序的默认算法。我认为它进行了字典排序,但是我发现了一些与此不符的行为,例如以下字符串:

alex.
alex.a
alex.Z
alexa
alex0
alexZ
alex.~
alex
alex.|
alex.}
alex.abc
Run Code Online (Sandbox Code Playgroud)

并使用类似的排序在外壳上对它们进行排序 echo 'stuff' | sort

这是我得到的结果:

alex
alex.
alex.~
alex.|
alex.}
alex0
alexa
alex.a
alex.abc
alexZ
alex.Z
Run Code Online (Sandbox Code Playgroud)

我想不通为什么alex0alexa之间出现在alex.}alex.a

谁可以给我解释一下这个?

linux sorting gnu gnu-sort

2
推荐指数
1
解决办法
2277
查看次数

我怎样才能让 GNU 排序把大写字母放在第一位?

我希望其他所有内容保持相同,只有大写字母在前。

sorting bash gnu textutils

2
推荐指数
1
解决办法
909
查看次数

在 GNU/Linux 上在哪里保存配置/数据文件?

我发现,通过将它们移动到 /bin 文件中,我可以轻松地执行我自己的程序。但我也看到,那里的很多程序只包含一个文件,可以完成一项简单的任务,不需要在文件中保存任何内容。

如果我想编写一个命令行程序,它也需要将它的值保存在一个文件中(例如一个存储玩家进度的基于文本的小游戏),程序应该在哪里存储它的数据?

Linux 中有几个专用位置。我想找出哪个位置最适合,例如需要图像文件和文本文件等数据以及需要存储玩家进度的游戏。

linux gnu

2
推荐指数
1
解决办法
4149
查看次数

GNU LD 链接器脚本 - 堆栈放置

这是我的 STM32L476 链接器脚本:

/* Generate a link error if heap and stack don't fit into RAM */
__heap_size = 0x200;;      /* required amount of heap  */
__stack_size = 0x800;; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
    FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
    RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 96K
}

/* Define output sections */
SECTIONS
{
  /* The startup code goes first into FLASH */
  .default_exceptions : …
Run Code Online (Sandbox Code Playgroud)

gcc arm gnu stm32 ld

2
推荐指数
1
解决办法
6502
查看次数

如何在字符串数组上循环

我有用 golang 实现的命令行工具,工作正常。我想执行一些应该提供字符串列表的命令

apps := $(shell fxt run apps)
apps:
    @echo $(apps) is called
Run Code Online (Sandbox Code Playgroud)

在终端中,我在执行时看到以下内容make(完全没问题)

[app1 app2] is called
Run Code Online (Sandbox Code Playgroud)

由于命令fxt run apps返回字符串数组 ( var apps []string)

我的问题是我怎么能遍历apps 变量?

命令返回的数据很好,但现在我需要获取这个列表(app1...appN)并循环它,我不清楚这个问题,我如何循环遍历字符串数组?

特殊情况是如果在循环列表中我app7应该如何在代码中做一个叉子,例如 if(app7) 打印mvn clean install

例子。

对于每个应用程序(在应用程序列表中)我需要运行命令

go test ./...

但是对于需要运行的app7

mvn clean install

和 app10

yarn

linux gnu makefile gnu-make go

2
推荐指数
1
解决办法
1984
查看次数

更改 REPL 以显示用户名、主机名和当前工作目录?

在 Guile 的 REPL 中,提示是scheme@(guile-user)>,但我希望它显示my-name@hostname(current-working-directory)>. 有没有办法做到这一点?

scheme gnu guile

2
推荐指数
1
解决办法
204
查看次数

什么决定了内存重映射操作后的位置无关性?

我已经开始阅读 Miro Samek 的“使用 GNU 构建裸机 ARM 系统”并发现自己陷入了某个问题。在 PDF 第 10 页的注释之一中可以找到导致我困惑的原因:

注意:函数 low_level_init() 可以用 C/C++ 编码,但有以下限制。该函数必须在 ARM 状态下执行,并且不能依赖于 .data 部分的初始化或 .bss 部分的清除。此外,如果内存重映射完全执行,它必须发生在 low_level_init() 函数内部,因为该函数返回后代码不再与位置无关

代码“不再与位置无关”究竟如何?似乎引用的代码(可在 PDF 的第 7 - 9 页上查看)在从标签返回low_level_init/返回后仍然与位置无关_cstartup_cstartup标签后面的指令似乎唯一不同的是它们引用了链接描述文件中定义的标签(指南的第 3 节)。

那么重映射究竟如何影响它后面的指令是否与位置无关呢?

assembly arm gnu remap position-independent-code

2
推荐指数
1
解决办法
81
查看次数

与串行和附加并行运行相比,并行仿真在经过一些时间步长后给出不同的结果

我正在尝试使用 OpenMP 在涡流模拟上并行运行代码。这些类似于粒子模拟,在粒子模拟中,在每个时间步长,涡旋在下一个时间步长的位置必须根据其速度计算,该速度由当前时间步长的所有其他涡旋的位置确定。一旦离开域,涡流就会被删除。我将并行版本的代码与串行版本的代码在每个时间步的漩涡数量进行比较,并多次运行每个版本。

对于串行版本,涡流计数在每个时间步都完全匹配。对于并行情况,所有运行都与串行情况匹配几十个时间步长,之后,每个并行运行都显示出差异,但与串行情况保持在 7-10% 的误差范围内(如在结果链接如下)。我知道这可能是由于在并行情况下由于不同线程之间分布而导致计算步骤顺序不同而导致的舍入误差,但误差真的应该高达 10% 吗?

我只在并行 do 构造中使用了reduction 子句。整个代码中唯一的并行区域vblob()是在一个模块内的函数内,我从主代码调用该模块。内所有的函数调用vblob()ixi()fxi()此模块的外部。

function vblob(blobs,xj,gj)
    complex(8), intent(in) :: blobs(:,:), xj
    complex(8) :: delxi, delxic, di, gvic, xi
    real(8), intent(in) :: gj
    real(8) :: vblob(2)
    integer :: p

    gvic = 0.0; delxi = 0.0; delxic = 0.0; di = 0.0; xi = 0.0
    !$omp parallel do private(xi,delxic,delxi,di) shared(xj) reduction(+:gvic)
    do p = 1, size(blobs,1)
      xi = ixi(blobs(p,1))
      delxic = xj-conjg(xi)
      delxi = xj-xi
      di …
Run Code Online (Sandbox Code Playgroud)

fortran gnu openmp

2
推荐指数
1
解决办法
219
查看次数

git 输出为空白,除非捕获为: echo "$(git branch)"

我遇到了一个奇怪的问题,我真的不知道它是由与我的 Git 安装或我的 shell 相关的东西引起的,还是完全由其他原因引起的。如果我在一个有大量分支和提交的 Git 存储库中,我尝试列出分支:

$ git branch
$ git branch -a
$ git branch --list
Run Code Online (Sandbox Code Playgroud)

根本没有输出。但是,如果我通过echo结果运行这些命令的输出,正如人们所期望的那样:

$ echo "`git branch`"
  local-branch-1
  local-branch-2
* master
$ echo "$(git branch -a)"
  local-branch-1
  local-branch-2
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master 
Run Code Online (Sandbox Code Playgroud)

我的配置是 macOS 10.14.6,通过 Homebrew 安装了 Git 2.29.2。我正在使用带有 Prezto 或 PowerLevel10k 配置的 ZSH 5.8(也是 Homebrew)。尽管这些工具的别名很多快捷方式到Git命令,没有什么是别名 git *可能是干扰:

$ type git
git is /usr/local/bin/git
git is /usr/bin/git
Run Code Online (Sandbox Code Playgroud)

我也试过一个原始的 Bash 5.0.18 shell,结果是一样的。

ZSH 选项卡完成正确显示了分支,例如,如果我:

$ git checkout <tab>
local-branch-1 …
Run Code Online (Sandbox Code Playgroud)

git shell homebrew zsh gnu

2
推荐指数
1
解决办法
69
查看次数