gpt4 book ai didi

c - 如何读取或写入交错数组?

转载 作者:行者123 更新时间:2023-11-30 16:41:51 25 4
gpt4 key购买 nike

我有一个包含 8 个位 vector 的数据结构,每个位 vector 64 位长。然而,这些数组的各个字节在数据结构中交错排列,而不是一个接一个地排列,给定位 vector 中的每个连续字节都在前一个字节之后 8 个字节。是否有一种有效的方法(例如并行加载和存储)在这些交错数组和现代 x86-64 CPU 上的 64 位字之间移动数据?带有嵌入式 asm 的 C 代码很好,但如果有一个使用 gcc 内在函数的解决方案那就更好了。

最佳答案

我不知道 x64 CPU 指令可以处理这样的交错数据。然而,由于这些 CPU 在移位和索引 I/O 方面速度相当快,因此我将使用以下方法进行 8 个内联移位/复制操作,并将剩余的工作留给优化器:

void Write (unsigned char*     bytes,
unsigned long long value,
int offset)
{
bytes [offset ] = (unsigned char) (value );
bytes [offset + 8] = (unsigned char) (value >> 8);
bytes [offset + 16] = (unsigned char) (value >> 16);
bytes [offset + 24] = (unsigned char) (value >> 24);
bytes [offset + 32] = (unsigned char) (value >> 32);
bytes [offset + 40] = (unsigned char) (value >> 40);
bytes [offset + 48] = (unsigned char) (value >> 48);
bytes [offset + 56] = (unsigned char) (value >> 56);
return;
}

void Read (unsigned char* bytes,
unsigned long long* value,
int offset)
{
*value = ((unsigned long long) bytes [offset ] ) |
((unsigned long long) bytes [offset + 8] << 8) |
((unsigned long long) bytes [offset + 16] << 16) |
((unsigned long long) bytes [offset + 24] << 24) |
((unsigned long long) bytes [offset + 32] << 32) |
((unsigned long long) bytes [offset + 40] << 40) |
((unsigned long long) bytes [offset + 48] << 48) |
((unsigned long long) bytes [offset + 56] << 56);
return;
}

此代码以小端顺序存储 64 位值。对于大端字节序,只需以相反的顺序读/写字节即可。

关于c - 如何读取或写入交错数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46120411/

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