小编Fin*_*ers的帖子

gcc:在 AMD 上启用 AVX

我一直在尝试让 AVX 正常运行,但无法编译我的 c++ 项目。我对 C++ 和编译很陌生,所以我将 CMake 与 CLion 和 GCC 一起使用。

在此输入图像描述

我知道我的处理器支持 AVX 和 AVX2,我编写了一个简单的测试程序:


#include <immintrin.h>
...

    __m256 A{};
    __m256 B{};
    __m256 AB = _mm256_add_ps(A,B);
    
    for(int i = 0; i < 8; i++){
        std::cout << AB[i] << std::endl;
    }
Run Code Online (Sandbox Code Playgroud)

遗憾的是,当尝试运行此程序时,我收到以下错误:

warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi]
   91 |     __m256 AB = _mm256_add_ps(A,B);
      |                                  ^
In file included from C:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/10.1.0/include/immintrin.h:51,
                 from A:\OneDrive\ProgrammSpeicher\CLionProjects\Koivisto\src_files\main.cpp:85:
C:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/10.1.0/include/avxintrin.h:147:1: error: inlining failed in call to 'always_inline' '__m256 _mm256_add_ps(__m256, __m256)': …
Run Code Online (Sandbox Code Playgroud)

c++ gcc cmake avx clion

7
推荐指数
0
解决办法
4832
查看次数

整洁: 说明

我试图自己实现整洁,使用原始论文但被卡住了。

假设在上一代我有以下物种:

Specie 1:     members: 100    avg_score: 100
Specie 2:     members: 150    avg_score: 120
Specie 3:     members: 300    avg_score: 50
Specie 4:     members: 10     avg_score: 110
Run Code Online (Sandbox Code Playgroud)

我现在对下一代的尝试。如下:

  1. 从每个物种中删除每个基因组,除了一个随机基因组。
  2. 将每个基因组放在物种中/也许创建一个新的
  3. 将物种的分数设置为物种中每个基因组分数的平均值。

    4.1 通过杀死每个物种中最差的 90% 来繁殖。

    4.2 选择一个物种,根据他们的分数。

    4.3 从那个物种中,选择 2 个基因组并培育一个新的基因组。

我不确定这是否是正确的尝试,尤其是当我“杀死”90% 的基因组时。这个百分比值是我现在随机选择的(这只是概念上的)。

如果一个物种,在杀死后,有 0 个成员。然后就灭绝了吗?

在我给出的例子中,如果我杀死 90%,物种 4 可能会灭绝。

我的尝试是否正确,或者一个物种通常是如何灭绝的?

neat genetic-algorithm genome

4
推荐指数
1
解决办法
437
查看次数

为什么 gcc 12.2 不优化从 main() 调用的 constexpr 函数中的除法到移位

我一直在使用 Godbolt 编译器并输入以下代码:

constexpr int func(int x)
{
    return x > 3 ? x * 2 : (x < -4 ? x - 4 : x / 2);
}

int main(int argc)
{
    return func(argc);
}
Run Code Online (Sandbox Code Playgroud)

代码有点简单。这里重要的部分是里面最后除以2 func(int x)。由于 x 是一个整数,基本上任何编译器都会将其简化为移位以避免除法指令。

x86-64 gcc 12.2(对于 Linux,因此 System V ABI)的程序集-O3如下所示:

main:
        cmp     edi, 3
        jle     .L2
        lea     eax, [rdi+rdi]
        ret
.L2:
        cmp     edi, -4
        jge     .L4
        lea     eax, [rdi-4]
        ret
.L4:
        mov     eax, edi
        mov     ecx, 2
        cdq
        idiv …
Run Code Online (Sandbox Code Playgroud)

c++ g++ integer-division compiler-optimization constexpr-function

4
推荐指数
1
解决办法
246
查看次数

JS/HTML:更新异步块内的进度条

我目前正在开发一个基于 html 的小型项目,其中我在 javascript 中进行了一些长时间运行的计算。我不擅长 javascript,所以我想在这里找到解决方案。基本上我的长时间运行的代码看起来像这样:

let simulation = new Simulation(system,iterations,step_size,callback_fn);
simulation.run();

Run Code Online (Sandbox Code Playgroud)

simulation.run-function 看起来像这样:

run() {
    ...
    for(let i = 0; i < this.steps; i++){
        ...
        this.callback(i+1);
    }
}
Run Code Online (Sandbox Code Playgroud)

通常该steps变量约为 100 万。我的计划是添加一个显示进度的进度条。

HTML:
<div class="progress mt-5">
    <div id="simulation-progress" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 0%"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

现在我的计划是使用我正在模拟的回调函数来更新我的进度条:

(async () => {
    const iterations = 1000000;
    const step_size  = 1;

    simulation_progress.setAttribute('style', `width:0%`);

    setTimeout(function(){
        let simulation = new Simulation(
            system,
            iterations,
            step_size,
            e => {
                if(e % 100000 === 0){
                    simulation_progress.setAttribute('style', …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous

2
推荐指数
1
解决办法
1024
查看次数