相关疑难解决方法(0)

Duff的设备如何工作?

我已经在Duff的设备上阅读了维基百科上文章,但是我没理解.我真的很感兴趣,但我已经在那里阅读了几次解释,但我仍然不知道Duff的设备是如何工作的.

更详细的解释是什么?

c duffs-device

139
推荐指数
6
解决办法
3万
查看次数

__builtin_prefetch,它读了多少?

我正在尝试使用优化一些C++(RK4)

__builtin_prefetch
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何预取整个结构.

我不明白const void *addr读了多少.我想要下载fromto加载的值.

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)

c++ optimization gcc x86-64 numerical-methods

16
推荐指数
2
解决办法
2万
查看次数

C++常量折叠素数循环

说完看了一眼前面的问题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循环并使用输出数据已知的优势?

我想在不使用模板元编程的情况下完成它. …

c++ g++ compiler-optimization constantfolding

10
推荐指数
1
解决办法
288
查看次数