Como programar um SO (Sistema Operacional) e que envolva controle de vetores?

Como fazer no seguinte sentido, tipo eu preciso de 50 * 120 * 160 * 240 + 80 * '140 * 180 * 240 * 280, para fazer controle de vetores… como é que eu faço isso?

Eu preciso programar um sistema operacional de distribuição linux do zero, é preciso de tudo para fazer ele funcionar?

Tipo por exemplo os componentes do sistema (Computador ou Máquina Pessoal) são o que é preciso para funcionar, certo?

E não estou dizendo que é no máximo 5-10 meses, é preciso no máximo uns 10-15 anos de experiencia em programação

@Daigo

Chamando o criador do tigeros.

Sim, claro… É muito bom ter um apoio para interpretar mais profundamente cada parte da fala.

Algum Desenvolvedor ou engenheiro de sistemas operacionais poderia me ajudar com um sistema de distribuição linux?

Rapá…. mas esse tema é muito avançado, comenta mais sobre o que é esse projeto.

Tentei aprofundar nisso aqui, mas é muito pra minha cabeça de branca :sweat_smile: . depois olha se essa pesquisa está no caminho certo, assim o pessoal pode ter um entendimento melhor.

Se for nessa linha, pelo visto você pode terá que fazer algo em Assembler ou C parece que algo também sobre OpenCL.

Depois comente conosco como foi o desenrolar dessa historia… Qual hardware você usou, se tem como emular…

Abrass!

1 curtida

Linux from Scratch

2 curtidas

Eu não compreendi bem o que você quer fazer, se puder elaborar? Essa expressão 50 * 120 * 160 * 240 + 80 * 140 * 180 * 240 * 280 é só uma conta de multiplicação. Não está claro o que você está querendo dizer por ‘controle de vetores’.

Você está falando de operar sobre um espaço vetorial com vetores? O conceito matemático? Ou você está se referindo à programação vetorial, onde “vetor” = array?

Estou me referindo a programação vetorial, onde “vetor” = array

Olha estou criando minha distribuição linux do zero usando LFS(Linux from scratch), pesquise sobre o LFS talvez te ajude.

Ok, nesse caso, você está provavelmente se referindo a 2 coisas:

  1. Operações SIMD, via intrínsecos da arquitetura;
  2. Sintaxe vetorial, sem loops, em linguagens como Python;

Independente disso, todos os OSes modernos suportam o que é necessário para fazer uso de operações SIMD. Você vai apenas precisar se preocupar com a arquitetura e linguagem. No caso da arquitetura, vai precisar verificar se o processador vai oferecer suporte aos intrínsecos, e no caso da linguagem, vai precisar usar o algoritmo e/ou bibliotecas adequadas.

A forma mais rápida de fazer uso da programação vetorial vai ser via Python, por exemplo:

import numpy as np

a = np.random.rand(1000).astype(np.float32)
b = np.random.rand(1000).astype(np.float32)

c = a + b
s = np.sum(c)  # redução vetorial
dot = a @ b    # produto interno (BLAS por baixo)

# broadcasting:

X = np.random.rand(1000, 256).astype(np.float32)
w = np.random.rand(256).astype(np.float32)

y = w + 10
Z = X * y     # w “expande” na dimensão certa

Por baixo dos panos, o Python + numpy (ou outra biblioteca para operações vetoriais com otimização) na maioria das vezes já faz uso das instruções SIMD adequadas. Existem outras bibliotecas, metodos via numba, etc…


Em C, o compilador às vezes detecta casos no seu código e otimiza sozinho, mas frequentemente, você precisa ser um pouco mais explicito, otimizando o espaço em memória deos ponteiros, e forçando a detecção com pragmas:

void add_float(size_t n,
               const float * restrict a,
               const float * restrict b,
               float * restrict c)
{
    #pragma omp simd      // se quiser forçar
    for (size_t i = 0; i < n; ++i) {
        c[i] = a[i] + b[i];
    }
}

Geralmente vai precisar massagear o compilador com algumas flags, por exemplo, para GCC/Clang: -O3 -march=native, dentre outras.

Ainda assim, não é garantia total em qualquer algoritmo, às vezes você vai preciso ser mais direto, cuidar do alinhamento você mesmo e usar o intrínseco da arquitetura explicitamente, por exemplo, AVX2:

#include <immintrin.h>
#include <stddef.h>

void add_float_avx2(size_t n, const float* a, const float* b, float* c)
{
    size_t i = 0;
    for (; i + 8 <= n; i += 8) {
        __m256 va = _mm256_loadu_ps(a + i); // carrega 8 floats
        __m256 vb = _mm256_loadu_ps(b + i); // carrega 8 floats
        __m256 vc = _mm256_add_ps(va, vb); // soma 8 floats “em paralelo”
        _mm256_storeu_ps(c + i, vc);
    }
    // calcula a rebarba
    for (; i < n; ++i) {
        c[i] = a[i] + b[i];
    }
}
  1. Operações SIMD, via intrinsecos da arquitetura;

Esse ponto 1 está descrito ali em cima de forma bem superficial e geral. Como mencionei, hoje em dia, OS é indiferente, todas as distros Linux e OSes modernos já suportam (o kernel suporta).

Na real, o OS é responsável por muito pouco, ele só precisa saber lidar com registradores e estados de registros especiais para estas operações na hora de salvar/restaurar contextos ao chavear entre processos.

Ou seja, depende apenas do programador, e é mais sobre saber alinhar, fazer uso dos melhores intrínsecos disponíveis para ocupar o potencial da CPU em particular e garantir que o haja fallbacks para CPUs mais antigas, etc.