gpt4 book ai didi

c++ - 为什么 Visual Studio 编译器不使用我的 Mersenne-Twister 实现进行循环展开?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:27 25 4
gpt4 key购买 nike

我目前独自工作Mersenne Twister C++中的实现。该算法涉及多次调用以下函数:

void twistIteration(uint32_t i)
{
uint32_t x = (mt[i] & MASK_UPPER) + (mt[(i + 1) % N] & MASK_LOWER);

uint32_t xA = x >> 1;

if (x & 1)
{
xA ^= A;
}

mt[i] = mt[(i + M) % N] ^ xA;
}

请注意,N、M 和 MASK_UPPER 是模板参数,因此它们在编译时是已知的。我在另一个函数中调用这个函数:

void twist()
{
for (uint32_t i = 0; i < N; i++)
{
twistIteration(i);
}

index = 0;
}

使用此算法生成 128.000.000 个随机数在我的机器上大约需要 0.95 秒。然而,我找到了一种通过稍微改变扭曲函数来显着加快算法速度的方法:

void twist()
{
for (uint32_t i = 0; i < N - 1; i++)
{
twistIteration(i);
}

twistIteration(N - 1);

index = 0;
}

换句话说,我展开循环的最后一次迭代,这样表达式 (i + 1) % N(i + M) % N 可以是在编译时计算。同样数量的随机数现在只需要 0.60 秒,这是一个巨大的进步。我的问题是:为什么编译器不为我做这件事?我使用默认的 VS2017 Release模式进行编译,并将“快速代码优化但更大的代码”设置为 true。是否缺少某些标志,或者这只是 Visual Studio 编译器的一些奇怪行为?

最佳答案

依靠编译器优化来处理这样的事情可能很棘手。最好的办法是尝试使用不同的标志,看看是否可以获得明显的差异。

也就是说,我会尝试显着增加您生成的元素的数量。这 0.35 秒很可能只是取决于各种其他因素的差异。尝试对需要一分钟(或更长时间)运行的内容进行压力测试,看看差异是否仍然如此显着。

关于c++ - 为什么 Visual Studio 编译器不使用我的 Mersenne-Twister 实现进行循环展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45022704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com