owned this note
owned this note
Published
Linked with GitHub
---
tags: LEO Satellite Project, Works
---
# Some notes in C acceleration
## Environment
CPU : I5-12400
RAM : 32G DDR4 3200
System : Windows 11 Insider Preview 25217 with WSL2 + WSLg
WSL System : Ubuntu 22.04 with VS code on WSL(Code server)
### Note: Here, CPU is important, check if your CPU support AVX2. My CPU can support AVX512, but fewer CPU can support these new extension, so here still use AVX2.
## Setting
Install WSL2 from Enable or Disable Windows Features(With or Without WSLg).
Install Ubuntu 22.04 from Windows Store.
Install Visual Studio Code from official Website.
Install Windows Termal(if needed) from Windows Store.
Open Windows Terminal and open Ubuntu 22.04 setting username and password.
> sudo apt update && sudo apt upgrade
> sudo apt install build-essential gdb
> cd ~
> mkdir LEO_channel_model
> cd LEO_channel_model
> code .
>
Then Ubuntu will install Code Server automatically.
Open VS code and install C/C++ extension.
Create test.c and copy the code below
````c=
#include <stdio.h>
#include <immintrin.h>
#define ARRAY_LENGTH 8
int main(int args){
__m256d first = _mm256_set_pd(10.0, 20.0, 30.0, 40.0);
__m256d second = _mm256_set_pd(5.0, 5.0, 5.0, 5.0);
__m256d result = _mm256_add_pd(first, second);
double* values = (double*) &result;
for (
unsigned short i = 0;
i < ARRAY_LENGTH;
i += 1
) {
printf("%f ", values[i]);
}
return 0;
}
````
### AVX2 compile arg
This is an example of adding double precision vector, and it'll failed normally.
It's because gcc9 didn't calls AVX2 extensions by default, we need to modify ./.vscode/tasks.json. Add "-mavx2", in "args". For example
````json
...
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 建置使用中檔案",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-mavx2",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
...
````
Then Run the c file again, it will output double numbers.
### Math compile arg
Also, gcc9 didn't call math function like cos(), sin(), exp() by default(even include <math.h>), need to add -lm in .vscode/task.json in current folder.
````json
...
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 建置使用中檔案",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-mavx2",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lm"
],
...
````
## Threading
~~## Threading using DThread~~
~~dependencies problem and segment fault.
Maybe cause by pointer mistake.
Threading would be very complecated, so just skip it.~~
After study, threading didn't necessarily use multicore to accelerate, so just forget it.
## Multicore
Currently, use OpenMP to accelerate, it use fpga-like pragma to parallel for loop, I guess there still have more feature.
for example
```c
#pragma omp parallel for num_threads(core numbers) ordered
```
While using AVX2, don't need to put thread number, since each core may have two thread, but have only one AVX2 circuit.
## Current Speed
Still slower than MATLAB, but can use all cpu core and push them to 100% usage.
Also, it's easier to run longer time scale without OOM.
## Install sin cos AVX function for non-Intel compiler
>sudo apt install libgtest-dev
>git clone https://github.com/reyoung/avx_mathfun
>cd avx_mathfun
>mkdir build
>cd build
>cmake -D CMAKE_BUILD_TYPE=Release ..
>make -j 2
>./test_avx2 ; ./test_avx
Then move the .h and .cpp file to target folder and include.
**But it only support _mm256 not _mm256d, so not suitable for us.**
## Enable AVX512 in Intel 12th Generation
### Environment
Motherboard:Asus Z690m plus
CPU: Intel I5-12400
BIOS ver: 2003
microcode from BIOS ver: 0407
### Prerequirement
1. MMTool
This tutorial is refer to [this website](https://www.overclock.net/threads/12900k-patching-older-ucode-to-restore-avx512.1796070/),you can get MMtool there.
2. AIDA64
3. Disable BIOS protection, Asus has this option in EZflash3.
### Check your CPU microcode
Each CPU may use different CPU microcode patch, so you need to check which microcode patch your CPU are used.
1. Check cpu revision
You can check it in AIDA64, for example, my CPU have 0675 edition, but this isn't showed in MMTool. This is why I don't suggested you to use CPU-Z, it can only shows version infomations.

In AIDA64, it shows CPU current revision is 23h, so can find corresponding revision in MMTool.
2. Replace Cpu microCode with the old one
Open MMTool, switch to CPU Patch page, then you can see several volumn. Find your Update Revision.

In my case, I need to replace CPU ID=0672. You can extract 0672 from old BIOS.

In my case, it's revision is 0D, which is older.

So just delete the microCode from new bios, and extract from the old one, then insert the new one.

After that, you'll get a modified new bios with old cpu microCode.
3. Flash it
Save it and flash in EZflash(need to disable some safty option in bios to write modified bios), or you can flash via AFUdos in other band's motherboard if they protect you to flash modified bios.
4. Results
Then you can enable AVX512 option in BIOS and enjoy AVX512.

From AIDA64, my microCode is replace with 0D version.

And you can also check which AVX512 extension you support.

=============================================
postscript:
You may ask me why not flash the older bios. I had to say Asus had block it. I cannot flash even previos version of BIOS, the reason is wrong motherboard version. Also in AFUdos, it blocked with reason BIOS write protetion. If you face the same problem, just try this method, or if you can downgrade your bios version, of course it'll be a wiser way.
## Use AVX512 to accelerate
1. Args of compile need to be change. From "-mavx2" to "-mavx512f".
2. Change all command from 256 to 512.
## Current problem
1. While using OpenMP, we cannot call function, or the retrun value will change even with static declaration.