Câu hỏi sau đây có liên quan, tuy nhiên câu trả lời đã cũ và nhận xét từ người dùng Marc Glisse cho thấy có những cách tiếp cận mới kể từ C ++ 17 cho vấn đề này có thể không được thảo luận đầy đủ.
Tôi đang cố gắng để bộ nhớ được căn chỉnh hoạt động chính xác cho SIMD, trong khi vẫn có quyền truy cập vào tất cả dữ liệu.
Trên Intel, nếu tôi tạo một vectơ nổi loại __m256
và giảm kích thước của tôi xuống 8 lần, nó sẽ cho tôi bộ nhớ căn chỉnh.
Ví dụ std::vector<__m256> mvec_a((N*M)/8);
Theo một cách hơi khó hiểu, tôi có thể truyền con trỏ đến các phần tử vectơ để nổi, cho phép tôi truy cập các giá trị float riêng lẻ.
Thay vào đó, tôi muốn có một std::vector<float>
cái được căn chỉnh chính xác, và do đó có thể được tải vào __m256
và các loại SIMD khác mà không bị lỗi.
Tôi đã xem xét căn chỉnh_alloc .
Điều này có thể cho tôi một mảng kiểu C được căn chỉnh chính xác:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
Tuy nhiên tôi không chắc làm thế nào để làm điều này cho std::vector<float>
. Trao std::vector<float>
quyền sở hữu marr_a
dường như là không thể .
Tôi đã thấy một số gợi ý rằng tôi nên viết một công cụ cấp phát tùy chỉnh , nhưng điều này có vẻ như rất nhiều công việc, và có lẽ với C ++ hiện đại, có cách nào tốt hơn không?
_mm256_loadu_ps(&vec[i])
. (Mặc dù lưu ý rằng với các tùy chọn điều chỉnh mặc định, GCC chia tách không bảo lãnh canh 256-bit tải / cửa hàng vào vmovups XMM / vinsertf128. Vì vậy, có là một lợi thế để sử dụng_mm256_load
trênloadu
nếu bạn quan tâm về cách biên dịch mã của bạn trên GCC nếu quên một người nào đó sử dụng-mtune=...
hoặc-march=
tùy chọn.)