如何优化大型uint64数组的异或(XOR)运算性能?
大型移位数组异或运算的性能优化问题
我需要对大型移位数组执行异或(XOR)运算,以下是便于说明的可移植版本函数。如何优化该运算性能?我尝试过使用AVX2但未获得明显提升。当前示例中的DB处理耗时50ms,对应12GB/s的速度,恳请提供优化建议。
#include <iostream> uint64_t partition_size = 4096; uint64_t entry_size = 32; // bytes uint64_t DB_size = 16777216; uint64_t *DB = new uint64_t[DB_size * entry_size/64]; //partition_index为partition_size的随机倍数,例如0、8192、4096等 //random_offset为[0, partition_size]范围内的随机数 void xor_shifted_arrays(uint32_t partition_index, uint32_t random_offset, uint64_t *result) { auto uint64_per_entry = entry_size / sizeof(uint64_t); int shift_offset; uint32_t shift; for (int i = 0; i < partition_size ; i = i + 1) { shift = (i + random_offset) & (partition_size - 1); shift_offset = shift * uint64_per_entry; for (int j = 0; j < uint64_per_entry; j=j+1){ result[shift_offset + j] = result[shift_offset + j] ^ DB[partition_index + j]; } partition_index = partition_index + uint64_per_entry; } }
更新1
- 已在两台设备上运行测试,编译时均启用O3优化:
- Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz(MacOS 13.6,16GB DDR4内存,编译器Apple clang 15.0.0)
- AWS r7i.2xlarge(Intel(R) Xeon(R) Platinum 8488C,Ubuntu系统,64GB DDR5内存,编译器g++ 11.4.0)
- 意外发现Xeon平台上运行速度慢一倍!
更新2:补充外层调用逻辑(非运行代码)
void outer_function(){ uint64_t *result1 = new uint64_t[partition_size]; uint64_t *result2 = new uint64_t[partition_size]; uint64_t number_partitions = 4096; for (int i=0; i< number_partitions; i++){ xor_shifted_arrays(i*partition_size, some_rnd_gen(), result1); } for (int i=0; i< number_partitions; i++){ xor_shifted_arrays(i*partition_size, some_rnd_gen(), result2); } }
内容的提问来源于stack exchange,提问作者CryptoKitty
相关产品推荐
相关产品推荐

