gpt4 book ai didi

c - 除以零不会导致 Nvidia Jetson 运行时异常

转载 作者:太空狗 更新时间:2023-10-29 17:02:16 24 4
gpt4 key购买 nike

我不是很熟悉 ARM 处理器的内部细节,但我不明白我的 Nvidia Jetson Nano 开发板上的以下行为。

C 代码示例 ...

//main.c

#include <stdio.h>

int main()
{
int fred = 123;
int i;

for(i = -10 ; i <= 10 ; i++)
printf("%d / %d == %d\n", fred, i, fred / i);

return 0;
}

编译:

gcc main.c -ggdb

运行生成的 a.out 可执行文件会产生以下输出...

123 / -10 == -12
123 / -9 == -13
123 / -8 == -15
123 / -7 == -17
123 / -6 == -20
123 / -5 == -24
123 / -4 == -30
123 / -3 == -41
123 / -2 == -61
123 / -1 == -123
123 / 0 == 0 //unexpected!
123 / 1 == 123
123 / 2 == 61
123 / 3 == 41
123 / 4 == 30
123 / 5 == 24
123 / 6 == 20
123 / 7 == 17
123 / 8 == 15
123 / 9 == 13
123 / 10 == 12

使用 gcc 3.7 在古老的 Pentium 4 上编译的完全相同的代码导致(正如预期的那样)当 i 达到 0 并导致被零除时抛出运行时异常。

Nvidia 开发板运行的是 Ubuntu 18.04 LTS、gcc 7.4.0 版(最新版),并且在其他方​​面运行良好。我还编译了这段代码的等效 Ada 语言版本,并且正如人们所期望的那样引发了一个运行时异常(因为 Ada 会代表我提前进行安全检查)。

我意识到在 C 语言中,“除以零会产生未定义的行为”可能是对此的解释,但对于同一编译器套件的两个版本为同一操作给出如此不同的结果让我感到困惑。

什么情况下会导致 Nvidia Tegra ARM(64 位)CPU 允许被零除而被操作系统忽略?

编辑:来自/etc/cpuinfo 的有关 CPU 的详细信息...

$ cat /proc/cpuinfo
processor : 0
model name : ARMv8 Processor rev 1 (v8l)
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd07
CPU revision : 1

.... truncated ....

最佳答案

Nvidia Jetson Nano 开发板使用基于 ARMv8 架构的 ARM Cortex-A57 ( Link )。基于指令集spec ARMv8 的整数除以零返回零并且不会被困。

2.3 Divide instructions

ARMv8-A supports signed and unsigned division of 32-bit and 64-bit sized values.

Instruction Description

SDIV Signed divide

UDIV Unsigned divide

...

Overflow and divide-by-zero are not trapped:

• Any integer division by zero returns zero

因此编译器在这种情况下生成sdiv(参见example)并且CPU毫无异常(exception)地返回0。当您在不同的平台上编译相同的代码时,每个其他 CPU 对被零除的 react 可能不同。正如您在问题中提到的,如果除以 0,C 标准未定义行为。

关于c - 除以零不会导致 Nvidia Jetson 运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com