我正在尝试使用优化一些C++(RK4)
__builtin_prefetch
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何预取整个结构.
我不明白const void *addr读了多少.我想要下载from和to加载的值.
for (int i = from; i < to; i++)
{
double kv = myLinks[i].kv;
particle* from = con[i].Pfrom;
particle* to = con[i].Pto;
//Prefetch values at con[i++].Pfrom & con[i].Pto;
double pos = to->px- from->px;
double delta = from->r + to->r - pos;
double k1 = axcel(kv, delta, from->mass) * dt; //axcel is an inlined function
double k2 = axcel(kv, delta + 0.5 * k1, from->mass) * dt; …Run Code Online (Sandbox Code Playgroud) 说完看了一眼前面的问题1,2,我在想,如果我可以强制编译器以下代码打印素数进行常量折叠.
#include <iostream>
using namespace std;
inline bool is_prime(int n)
{
if(n<2)
return false;
for(int i=2;i*i<=n;i++)
if(n%i==0)
return false;
return true;
}
int main()
{
for(int i=0;i<20;i++)
if(is_prime(i))
cout<<i<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我通过以下方式构建它:
g++ -O3 -S main.cpp -o main.asm
Run Code Online (Sandbox Code Playgroud)
结果是一些:
2,3,5,7,11,13,17,19
Run Code Online (Sandbox Code Playgroud)
我想强制编译看看类似的代码
for(int x:{2,3,5,7,11,13,17,19})
cout<<x<<endl;
Run Code Online (Sandbox Code Playgroud)
要么
cout<< 2 <<endl;
cout<< 3 <<endl;
cout<< 5 <<endl;
cout<< 7 <<endl;
cout<< 11 <<endl;
cout<< 13 <<endl;
cout<< 17 <<endl;
cout<< 19 <<endl;
Run Code Online (Sandbox Code Playgroud)
但阅读大会表明没有发生.
我甚至使用__builtin_expect但它没有用.
有没有办法强制编译器优化器读取for循环并使用输出数据已知的优势?
我想在不使用模板元编程的情况下完成它. …