Teknologi penjajaran memori dalam pengoptimuman prestasi fungsi C++

PHPz
Lepaskan: 2024-04-23 21:42:02
asal
548 orang telah melayarinya

Penjajaran memori meletakkan pembolehubah dalam struktur data pada sempadan tertentu untuk meningkatkan kelajuan akses memori. Dalam C++, penjajaran memori boleh dicapai melalui makro atribut ((disejajarkan)) atau arahan pek #pragma. Sebagai contoh, menjajarkan ahli struktur kepada sempadan 4-bait boleh meningkatkan prestasi mengakses data ahli itu dengan ketara kerana komputer moden mengakses memori dalam blok 4-bait. Ujian penanda aras menunjukkan bahawa struktur sejajar diakses hampir dua kali lebih pantas berbanding struktur tidak sejajar.

C++ 函数性能优化中的内存对齐技术

Teknologi penjajaran memori dalam pengoptimuman prestasi fungsi C++

Pengenalan

Penjajaran memori merujuk kepada meletakkan pembolehubah dalam struktur data pada alamat memori supaya ia boleh dibahagikan dengan integer saiz tertentu. Dalam C++, penjajaran memori boleh dicapai dengan menggunakan makro __attribute__ ((aligned)) atau arahan #pragma pack. __attribute__ ((aligned)) 宏或 #pragma pack 指令来实现。

原理

现代计算机以特定大小的块(称为缓存行)访问内存。如果变量的地址与缓存行的边界对齐,则访问该变量的数据可以一次性加载到缓存中。这可以显著提高内存访问速度。

实战案例

考虑以下结构体:

struct UnalignedStruct {
  int x;
  char y;
  double z;
};
Salin selepas log masuk

此结构体未对齐,因为它没有将成员放置在内存地址的 4 字节边界上。可以通过使用 __attribute__ ((aligned)) 宏强制对齐此结构体:

struct AlignedStruct {
  int x;
  char y __attribute__ ((aligned (4)));
  double z;
};
Salin selepas log masuk

现在,y 成员的地址将对齐到 4 字节边界上,这可以提高访问 y

Prinsip

Komputer moden mengakses memori dalam blok saiz tertentu yang dipanggil talian cache. Jika alamat pembolehubah diselaraskan dengan sempadan baris cache, data yang mengakses pembolehubah boleh dimuatkan ke dalam cache sekali gus. Ini boleh meningkatkan kelajuan akses memori dengan ketara.

Contoh Praktikal

Pertimbangkan struktur berikut: 🎜
#include <iostream>
#include <benchmark/benchmark.h>

struct UnalignedStruct {
  int x;
  char y;
  double z;
};

struct AlignedStruct {
  int x;
  char y __attribute__ ((aligned (4)));
  double z;
};

void BM_UnalignedAccess(benchmark::State& state) {
  UnalignedStruct s;
  for (auto _ : state) {
    benchmark::DoNotOptimize(s.y);  // Prevent compiler optimization
    benchmark::ClobberMemory();
  }
}

void BM_AlignedAccess(benchmark::State& state) {
  AlignedStruct s;
  for (auto _ : state) {
    benchmark::DoNotOptimize(s.y);  // Prevent compiler optimization
    benchmark::ClobberMemory();
  }
}
BENCHMARK(BM_UnalignedAccess);
BENCHMARK(BM_AlignedAccess);
Salin selepas log masuk
🎜Struktur ini tidak sejajar kerana ia tidak meletakkan ahli pada sempadan 4-bait alamat memori. Anda boleh memaksa penjajaran struktur ini dengan menggunakan makro __attribute__ ((aligned)): 🎜
Benchmark                         Time             CPU   Iterations
-----------------------------------------------------------------------------------
BM_UnalignedAccess             12.598 ns        12.591 ns     5598826
BM_AlignedAccess                6.623 ns         6.615 ns    10564496
Salin selepas log masuk
🎜 Kini, alamat ahli y akan diselaraskan pada 4- sempadan bait, yang berfungsi Meningkatkan prestasi mengakses data y. . struktur tidak sejajar. 🎜

Atas ialah kandungan terperinci Teknologi penjajaran memori dalam pengoptimuman prestasi fungsi C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan