Наступне питання пов'язане, однак відповіді на старі, і коментар від користувача Marc Glisse передбачає , що є нові підходи , починаючи з C ++ 17 до вирішення цієї проблеми , які не можуть бути адекватно обговорені.
Я намагаюся вирівняти пам'ять, що працює належним чином для SIMD, але все ще маю доступ до всіх даних.
Якщо в Інтернеті я створюю поплавковий вектор типу __m256
і зменшую розмір в 8 разів, це дає мені вирівняну пам'ять.
Напр std::vector<__m256> mvec_a((N*M)/8);
Трохи хакітним способом я можу наводити покажчики на векторні елементи, щоб плавати, що дозволяє мені отримувати доступ до окремих значень плавучого.
Натомість я хотів би мати std::vector<float>
правильне вирівнювання, і таким чином можна завантажувати в __m256
інші SIMD типи без сегментації.
Я дивився в align_alloc .
Це може дати мені масив у стилі C, який правильно вирівняний:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
Однак я не знаю, як це зробити std::vector<float>
. Надання std::vector<float>
права власності на marr_a
, здається, неможливо .
Я бачив кілька пропозицій про те, що мені слід написати спеціальний розподільник , але це, здається, багато роботи, і, можливо, з сучасним C ++ є кращий спосіб?
_mm256_loadu_ps(&vec[i])
. (Не дивлячись на те, зверніть увагу , що з параметрами налаштування по замовчуванню, GCC розщеплюється гарантованою вирівняний 256-бітові навантажень / магазинів в vmovups XMM / vinsertf128. Так що це перевага для використання_mm256_load
більш ,loadu
якщо ви дбаєте про те , як ваш код компілюється на GCC якщо хто - то забуває використання-mtune=...
або-march=
варіанти.)