小编Sak*_*ain的帖子

无符号和签名扩展

有人可以向我解释以下代码输出:

void myprint(unsigned long a)
{
    printf("Input is %lx\n", a);
}
int main()
{
    myprint(1 << 31);
    myprint(0x80000000);
}
Run Code Online (Sandbox Code Playgroud)

输出gcc main.c:

Input is ffffffff80000000
Input is 80000000
Run Code Online (Sandbox Code Playgroud)

为什么被(1 << 31)视为签名并被0x80000000视为未签名?

c unsigned language-lawyer

10
推荐指数
2
解决办法
1816
查看次数

为什么内核中没有使用SIMD指令?

我在内核中找不到很多SIMD指令(如SSE/AVX)(除了一个用于加速RAID6奇偶校验计算的地方).

Q1)是否有任何特定原因或仅缺少用例?

Q2)如果我想使用SIMD指令,比如设备驱动程序,今天需要做什么?

Q3)将像ISPC这样的框架纳入内核(仅用于实验)有多难?

operating-system simd linux-device-driver linux-kernel ispc

6
推荐指数
1
解决办法
892
查看次数

Go中的地址对齐

所以我使用 c2go 将 C 代码与 Go 链接起来。C 代码要求从 Go 调用的函数的某些参数是 256 位对齐的(函数参数都是指向 Go 变量的指针)。有没有办法实现 Go(即在 Go 中为变量指定 256 对齐)?

在 Go 中,“unsafe.Alignof(f)”显示为 8 个字节对齐(对于“var f [8]float32”),即 Go 保证 f 仅对齐 8 个字节。我需要它以某种方式对齐 32 个字节。

对于好奇:C 代码正在使用 SIMD 指令(具体来说是 AVX)。我正在使用“vmovaps”指令,它需要操作数的 256 位对齐。我可以使用不需要对齐的“vmovups”,但我怀疑这会降低性能。

c x86 simd go avx

6
推荐指数
1
解决办法
1039
查看次数