所以我一直在用 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
所以我有很多问题;
嗯,就是这样。
该示例使用 gcc 编译为,
gcc simple.c -o simple
我需要帮助理解 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)
我想不通为什么alex0和alexa之间出现在alex.}和alex.a
谁可以给我解释一下这个?
我发现,通过将它们移动到 /bin 文件中,我可以轻松地执行我自己的程序。但我也看到,那里的很多程序只包含一个文件,可以完成一项简单的任务,不需要在文件中保存任何内容。
如果我想编写一个命令行程序,它也需要将它的值保存在一个文件中(例如一个存储玩家进度的基于文本的小游戏),程序应该在哪里存储它的数据?
Linux 中有几个专用位置。我想找出哪个位置最适合,例如需要图像文件和文本文件等数据以及需要存储玩家进度的游戏。
这是我的 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) 我有用 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
在 Guile 的 REPL 中,提示是scheme@(guile-user)>,但我希望它显示my-name@hostname(current-working-directory)>. 有没有办法做到这一点?
我已经开始阅读 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 节)。
那么重映射究竟如何影响它后面的指令是否与位置无关呢?
我正在尝试使用 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) 我遇到了一个奇怪的问题,我真的不知道它是由与我的 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)