прекращаем этот базар про разные "породы" МК.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Это вы с флагами накосячили. Смотрите, я там -mtune=cortex-m0 написал, но видите всякие movge, которых у M0 быть не должно? ) Для ARM нужно использовать -mcpu, а -mtune за набор инструкций не отвечает, как какой-то generic набор...ПростоНуб писал(а):И так не складывается.
Запускаю arm-none-eabi-gcc -O3 -mtune=cortex-m33 -S -o median-c.s ./median.c
Код: Выделить всё
LED blink C STM32F103C8T6?Код: Выделить всё
text data bss dec hex filename
640 12 1572 2224 8b0 blink.elfКод: Выделить всё
; Define the clock frequency
.equ F_CPU = 16000000
; Define the LED pin
.equ LED_PIN = PB0
; Define the delay loop counter
.equ DELAY_COUNTER = 0xFF
; Initialize the stack pointer
.org 0x00
jmp start
; Main program
start:
; Set the LED pin as output
ldi r16, (1 << LED_PIN)
out DDRB, r16
loop:
; Turn the LED on
ldi r16, (1 << LED_PIN)
out PORTB, r16
; Delay for a short period
ldi r17, DELAY_COUNTER
delay_loop:
dec r17
brne delay_loop
; Turn the LED off
ldi r16, (0 << LED_PIN)
out PORTB, r16
; Delay for a short period
ldi r17, DELAY_COUNTER
delay_loop2:
dec r17
brne delay_loop2
; Repeat the loop
rjmp loop
Код: Выделить всё
#include <algorithm>
#include <cstdint>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BUF_SIZE 400000*77
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define SWAP(a,b,type) {type ttttttttt=a;a=b;b=ttttttttt;}
int median5_adrift(int* arr)
{
int a = arr[0], b = arr[1], c = arr[2], d = arr[3], e = arr[4];
if (a > b) std::swap(a, b);
if (b > c) std::swap(b, c);
if (c > d) std::swap(c, d);
if (a > b) std::swap(a, b);
if (b > c) std::swap(b, c);
if (c > e) std::swap(c, e);
if (a > b) std::swap(a, b);
return (b > c) ? b : c;
}
int median3 (int a, int b, int c) {
return MAX(MIN(a,b),MIN(c,MAX(a,b)));
}
int median5 (int *v) {
return median3(
v[4],
MAX(MIN(v[0], v[1]), MIN(v[2], v[3])),
MIN(MAX(v[0], v[1]), MAX(v[2], v[3]))
);
}
void do_only_mean(int *rand_buf, int *res_buf) {
for (int i = 0; i < BUF_SIZE - 5; i++) {
res_buf[i] = median5(rand_buf++);
}
return;
}
void adrift_do_only_mean(int *rand_buf, int *res_buf) {
for (int i = 0; i < BUF_SIZE - 5; i++) {
res_buf[i] = median5_adrift(rand_buf++);
}
return;
}
int main() {
int *rand_buf = (int*) malloc(BUF_SIZE*sizeof(int));
int *res_buf = (int*) malloc(BUF_SIZE*sizeof(int));
srand(time(NULL));
for ( int i = 0; i < BUF_SIZE; i++) {
rand_buf[i] = rand();
}
clock_t start = clock() ;
adrift_do_only_mean(rand_buf, res_buf);
clock_t end = clock() ;
double adrift_elapsed_time = (end - start) / (double)CLOCKS_PER_SEC;
start = clock() ;
do_only_mean(rand_buf, res_buf);
end = clock() ;
double mean_elapsed_time = (end - start) / (double)CLOCKS_PER_SEC;
printf("%f -- %f => %f\n", adrift_elapsed_time, mean_elapsed_time, adrift_elapsed_time / mean_elapsed_time);
}
Код: Выделить всё
vmovd (%rdi), %xmm2
vmovd 4(%rdi), %xmm4
vmovd 8(%rdi), %xmm0
vpminsd %xmm4, %xmm2, %xmm1
vmovd 12(%rdi), %xmm5
vpminsd %xmm5, %xmm0, %xmm3
vpmaxsd %xmm4, %xmm2, %xmm2
vpmaxsd %xmm5, %xmm0, %xmm0
vpmaxsd %xmm1, %xmm3, %xmm3
vpminsd %xmm2, %xmm0, %xmm0
vmovd 16(%rdi), %xmm1
vpmaxsd %xmm3, %xmm1, %xmm2
vpminsd %xmm3, %xmm1, %xmm1
vpminsd %xmm2, %xmm0, %xmm0
vpmaxsd %xmm1, %xmm0, %xmm0
vmovd %xmm0, %eax
ret
Код: Выделить всё
movl (%rdi), %r8d
movl 4(%rdi), %edx
movl 8(%rdi), %eax
movl 12(%rdi), %ecx
movl 16(%rdi), %esi
cmpl %edx, %r8d
jg .L2
cmpl %eax, %edx
jle .L8
movl %edx, %edi
movl %r8d, %edx
movl %edi, %r8d
.L3:
cmpl %r8d, %ecx
movl %eax, %edi
cmovg %r8d, %ecx
cmpl %edx, %eax
cmovge %edx, %eax
cmovge %edi, %edx
.L4:
cmpl %ecx, %edx
movl %ecx, %edi
cmovle %edx, %ecx
cmovle %edi, %edx
cmpl %ecx, %eax
cmovl %ecx, %eax
cmpl %edx, %esi
cmovle %esi, %edx
cmpl %edx, %eax
cmovl %edx, %eax
ret
.p2align 4
.p2align 3
.L2:
cmpl %eax, %r8d
jg .L3
cmpl %ecx, %eax
cmovle %eax, %ecx
movl %edx, %eax
movl %r8d, %edx
jmp .L4
[uquote="Adrift",url="/forum/viewtopic.php?p=4644275#p4644275"]далеко не все в принципе смогли на хоть какие-то 32-х битные мк перейти,[/uquote]std::swap не векторизуется. Ну хоть убейся. А сравнения - легко и просто.
Одно из немногих исключений, лично я XTensa терпеть не могу ) И то что векторизация там есть вовсе не означает, что компилятор для далеко не самого популярного ядра автоматически сгенерит код в котором она будет задействована.ПростоНуб писал(а):И на STM32 свет что ли клином сошелся?
Например, ESP32-S3, выпущенный в 2020 году, поддерживает векторизацию.
Писать можно, но ведь с чего все началось? Вам сказали, что пузырьковая сортировка вполне справляется с задачами когда нужно отсортировать 5 элементов, в ответ вы предоставили бенчмарк на ПК с векторизацией ) Затем я привел пример того, что пузырьковая сортировка может быть даже быстрее вашего алгоритма, на M33, а значит весьма вероятно и на других кортексах тоже. В ответ вместо признания этого факта опять идут апелляции к тестам на ПК. Подходы к написанию софта на ПК и мк разные, это вроде очевидная истина...ПростоНуб писал(а):По этой логике получается, если далеко не все поставили себе на даче автоматические раздвижные ворота, то о них и писать нельзя?![]()