![](/img/trans.png)
[英]Confusion between C++ and OpenGL matrix order (row-major vs column-major)
[英]C++ calculate Row major and Column major access time
我想通过以下两种方式计算访问时间:行专业和列专业,因为我们知道C / C ++是行专业,所以当我们以第一种方式(行专业)处理时,我们应该更快。 但是用C ++语言看一下这段代码
#include <iostream>
#include <time.h>
#include <cstdio>
clock_t RowMajor()
{
char* buf =new char [20000,20000];
clock_t start = clock();
for (int i = 0; i < 20000; i++)
for (int j = 0; j <20000; j++)
{
++buf[i,j];
}
clock_t elapsed = clock() - start;
delete [] buf;
return elapsed ;
}
clock_t ColumnMajor()
{
char* buf =new char[20000,20000];
clock_t start = clock();
for (int i = 0; i < 20000; i++)
for (int j = 0; j < 20000; j++)
{
++buf[j,i];
}
clock_t elapsed = clock() - start;
delete [] buf;
return elapsed ;
}
int main()
{
std::cout << "Process Started." << std::endl;
printf( "ColumnMajor took %lu microSeconds. \n", ColumnMajor()*1000000/ (CLOCKS_PER_SEC) );
printf( "RowMajor took %lu microSeconds. \n", RowMajor() *1000000/ (CLOCKS_PER_SEC) );
std::cout << "done" << std::endl; return 0;
}
但是,每当我运行此代码时,我都会得到不同的答案,有时Rowmajor时间比列主要时间要好一些,有时相反,任何帮助都可以得到。
在C ++中,不能使用逗号运算符创建/访问矩阵。 要创建matrix
您需要跟踪with
和height
并将所有内存分配为一个数组。 基本上,您需要创建一个向量,该向量的数量或元素等于矩阵中元素的数量,然后通过x + y * width
获得每个元素。
clock_t RowMajor()
{
int width = 20000;
int height = 20000;
char* buf = new char[width * height];
clock_t start = clock();
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
++buf[i + width * j];
}
clock_t elapsed = clock() - start;
delete[] buf;
return elapsed;
}
对于ColumnMajor
的buf
需要与被访问buf[j * width + i];
创建矩阵的另一种方法(通过注释,感谢James Kanze)是像这样创建缓冲区: char (*buf)[20000] = new char[20000][200000]
。 在这种情况下,访问缓冲区就像: buf[i][j]
最安全的方法是使用std :: vector或array,并避免使用new / delete。 使用std :: vector防止缓冲区写溢出:
clock_t RowMajor()
{
int width = 20000;
int height = 20000;
std::vector<char> buf;
buf.resize(width * height);
clock_t start = clock();
for (int j = 0; j <height; j++)
for (int i = 0; i <width; i++)
{
++buf[i + j * width];
}
clock_t elapsed = clock() - start;
return elapsed;
}
感谢Raxvan,这是到目前为止的最终代码
#include <iostream>
#include <time.h>
#include <cstdio>
#include <windows.h>
int calc = 0;
clock_t RowMajor()
{
int width = 20000;
int height = 20000;
char* buf = new char[width * height];
clock_t start = clock();
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
++buf[i + width * j];
}
clock_t elapsed = clock() - start;
delete[] buf;
return elapsed;
}
clock_t ColumnMajor()
{
int width = 20000;
int height = 20000;
char* buf = new char[width * height];
clock_t start = clock();
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
++buf[j + width * i];
}
clock_t elapsed = clock() - start;
delete[] buf;
return elapsed;
}
int main()
{
std::cout << "Process Started." << std::endl;
calc= ColumnMajor() /CLOCKS_PER_SEC ;
printf( "ColumnMajor took %lu . \n", calc );
calc=RowMajor()/CLOCKS_PER_SEC ;
printf( "RowMajor took %lu . \n", calc );
std::cout << "done" << std::endl; return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.