我想在允许使用矢量化的c ++中乘以几个矩阵。但是,以下代码会导致较大的执行时间〜858146125 ns。我如何修改代码,以便对矩阵乘法进行矢量化处理并达到大约100ns的执行时间。 我正在使用O3标志。
const int ROWS = 1000;
const int COLS = 1000;
const int ROWS1 = 1000;
const int COLS1 = 1000;
const int l = 1000;
double random_matrix[ROWS][COLS];
double random_matrix1[ROWS1][COLS1];
double mult[l][l];
int i;
int j;
/* generate number: */
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++)
random_matrix[i][j] = i + j;
}
for (i = 0; i < ROWS1; i++) {
for (j = 0; j < COLS1; j++)
random_matrix1[i][j] = i + j;
}
auto start = std::chrono::steady_clock::now();
for (size_t row = 0; row < ROWS; ++row) {
for (size_t tmp = 0; tmp < COLS1; ++tmp) {
mult[row][tmp] = random_matrix[row][0]*random_matrix1[0][tmp];
for (size_t col = 1; col < COLS; ++col) {
mult[row][tmp] += random_matrix[row][col] * random_matrix1[col][tmp];
}
}
}
auto end = std::chrono::steady_clock::now();
std::cout << "Elapsed time in nanoseconds : "
<< std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
<< " ns" << std::endl;
std::cout<<"\n";
for (i=0;i<ROWS;i++)
{
for (j=0;j<COLS1;j++)
std::cout << mult[i][j] <<std::endl; //display table
std::cout<<"\n";
}
答案 0 :(得分:3)
恐怕无论有矢量化或无矢量化,使用这些矩阵大小,您将永远无法达到100 ns的总执行时间。两个矩阵1000 x 1000元素的矩阵乘法的数量级为1000 ^ 3 = 1,000,000,000乘法加法。那是十亿次手术。
第二,如果性能对您来说非常重要,则不应为这些低级数学基元编写自己的代码。有优化的C ++库可以为您执行这些操作,例如Eigen或BLAS(Intel MKL是实现BLAS的软件包)。
通过使用这些软件包之一,您不仅可以获得更好的性能,而且还避免了其他情况下可能出现的陷阱或错误。