Disclamer:我是一个新手,所以如果这个肮脏的农民问一些不好的问题。
据我了解,AVX-512架构可以同时处理多达16个浮点变量,而AVX2"仅#34; 4.
为了利用这一点,必须对齐数据。当我发现here时,可以通过以下方式完成:
对于AVX-512:
alignas(32) float a[8];
对于AVX2:
alignas(16) float a[8];
好的,所以我的第一个问题是:,因为16是因子32,为什么我们也不总是将alignas(32)
用于AVX2架构?也许(可能)我错过了什么。
然后,我有这个功能:
bool interpolate(const Mat &im, Mat &res, /*...*/){/*...*/}
分配的内容:
cv::Mat im(r, c, CV_32FC1); //similarly res
英特尔编译器报告告诉我这两个矩阵没有对齐。所以我的第二个问题是: 如何分配它们以便它们是16/32对齐?我可以分配一个对齐的指针,并将它传递给cv::Mat
构造函数,如:
float *aligned_ptr = /*allocate r*c 16/32 aligned floating points*/
cv::Mat m (r, c, CV_32FC1, /* use aligned_ptr somehow*/);