Navigation

    cpp-logo

    C++ Community

    • Registrieren
    • Anmelden
    • Suche
    • Kategorien
    • Aktuell
    • Tags
    • Beliebt
    • Gruppen
    1. Übersicht
    2. Beliebt
    Melde dich an, um einen Beitrag zu erstellen
    • Alle Kategorien
    • Ankündigungen
    •      Die Artikel
    • C++ (alle ISO-Standards)
    •      MFC
    •      VCL (C++ Builder)
    •      C++/CLI mit .NET
    •      Andere GUIs - Qt, GTK+, wxWidgets
    • Sonstige Programmiersprachen
    •      C (alle ISO-Standards)
    •      C# und .NET
    •      Java
    •      Assembler
    •      Webzeugs
    • Betriebssysteme
    •      WinAPI
    •      Linux/Unix
    •      Projekt: OS-Development
    •      DOS und Win32-Konsole (nur Lesen)
    • Weitere Fachbereiche
    •      Mathematik und Physik
    •      Spiele-/Grafikprogrammierung
    •      Datenbanken
    •      Compiler- und IDE-Forum
    •      Projekte
    • Jenseits der Programmierung
    •      Beruf und Ausbildung
    •      Stellenangebote
    •      Themen rund um die IT
    •      Gaming-Corner
    • Forentechnik
    • Archiv
    •      Das C++ Magazin
    •          Die Redaktion
    •          Die Autoren
    •          Allgemeines zum Magazin
    •          Archiv
    •      Organisation des Forumtreffens
    •      FAQs - Frequently Asked Questions
    •          FAQ - C (C89, C99 und C11)
    •          FAQ - Assembler
    •          FAQ - C++ (auch C++0x, C++11)
    •          FAQ - C++/CLI
    •          FAQ - C++ Builder (VCL/CLX)
    •          FAQ - C# und .NET
    •          FAQ - Compiler & IDEs
    •          FAQ - Datenbanken
    •          FAQ - DOS und Win32-Konsole
    •          FAQ - Grafik-/Spieleprogrammierung
    •          FAQ - GUIs
    •          FAQ - Java
    •          FAQ - Linux/Unix
    •          FAQ - Mathematik und Physik
    •          FAQ - MFC
    •          FAQ - Rund um die Programmierung
    •          FAQ - Sonstiges
    •          FAQ - Webzeugs
    •          FAQ - WinAPI
    •          FAQ - Forentechnik
    • Alle Themen
    • Neue Themen
    • Beobachtete Themen
    • Unbeantwortete Themen
    • Gesamter Zeitraum
    • Tag
    • Woche
    • Monat

    • L

      Funktion optimieren
      Assembler • • Lennox  

      22
      0
      Stimmen
      22
      Beiträge
      329
      Aufrufe

      L

      @wob Hattest recht, eine Menge Formate-Warnungen... Habe es mal mit -Wall kompiliert... #include <stdio.h> #include <stdlib.h> #include <sys/time.h> size_t initial_seed = 123; size_t n = 100; size_t rand1(size_t seed, size_t max) { size_t a = 16807; return (a * seed) % max; } size_t my_rand(size_t max) { size_t r = rand1(initial_seed, max); initial_seed = rand1(initial_seed, -1); return r; } void fill(size_t m, size_t a[m][n]) { for (size_t i = 0; i < m; i++) { for (size_t j = 0; j < n; j++) { a[i][j] = my_rand(51); } } } double average(size_t a[]) { // The average should be around 25. double average = 0; for (size_t i = 0; i < n; i++) { average += (double)a[i] / (double)n; } return average; } void print(size_t m, size_t a[m][n]) { for (size_t i = 0; i < n; i++) { printf("%zu ", a[0][i]); } printf("\na: %f\n...\n", average(a[0])); // ... for (size_t i = 0; i < n; i++) { printf("%zu ", a[m - 1][i]); } printf("\na: %f\n\n---\n\n", average(a[m - 1])); } // Comparison function for sort_a int compare(const void *a, const void *b) { return (*(size_t *)a - *(size_t *)b); } void sort_a(size_t arr[]) { qsort(arr, n, sizeof(size_t), compare); } #pragma GCC push_options #pragma GCC optimize("O0") void sort_b_optimized(size_t arr[]) { asm volatile( " movq %[arr], -40(%%rbp) \n" " movq $0, -8(%%rbp) \n" " movq $1, -16(%%rbp) \n" "1: \n" " movq -8(%%rbp), %%rax \n" " leaq 0(,%%rax,8), %%rdx \n" " movq -40(%%rbp), %%rax \n" " addq %%rdx, %%rax \n" " movq (%%rax), %%rax \n" " movq %%rax, -24(%%rbp) \n" " movq -16(%%rbp), %%rax \n" " leaq 0(,%%rax,8), %%rdx \n" " movq -40(%%rbp), %%rax \n" " addq %%rdx, %%rax \n" " movq (%%rax), %%rax \n" " movq %%rax, -32(%%rbp) \n" " movq -24(%%rbp), %%rax \n" " cmpq %%rax, -32(%%rbp) \n" " jnb 2f \n" " movq -8(%%rbp), %%rax \n" " leaq 0(,%%rax,8), %%rdx \n" " movq -40(%%rbp), %%rax \n" " addq %%rax, %%rdx \n" " movq -32(%%rbp), %%rax \n" " movq %%rax, (%%rdx) \n" " movq -16(%%rbp), %%rax \n" " leaq 0(,%%rax,8), %%rdx \n" " movq -40(%%rbp), %%rax \n" " addq %%rax, %%rdx \n" " movq -24(%%rbp), %%rax \n" " movq %%rax, (%%rdx) \n" " movq $0, -8(%%rbp) \n" " movq $1, -16(%%rbp) \n" " jmp 3f \n" "2: \n" " addq $1, -8(%%rbp) \n" " addq $1, -16(%%rbp) \n" "3: \n" " movq %[n], %%rax \n" " cmpq %%rax, -16(%%rbp) \n" " jb 1b \n" : /* No outputs. */ : [n] "m"(n), [arr] "r"(arr) : "memory"); } #pragma GCC pop_options void sort_c(size_t arr[]) { for (size_t i = 0; i < n - 1; i++) { size_t a = i; size_t b = arr[i]; for (size_t j = i + 1; j < n; j++) { if (arr[j] < b) { a = j; b = arr[j]; } } arr[a] = arr[i]; arr[i] = b; } } void set_time(long *t_old, long *t, long *max_dif) { struct timeval tv; gettimeofday(&tv, 0); *t = tv.tv_usec; long dif = *t - *t_old; if (dif > *max_dif) { *max_dif = dif; } } int main(int argc, char const *argv[]) { long t1, t2, t3, t4, t5, t6, max_dif = 0; size_t iterations = 10000; size_t arr[iterations][n]; fill(iterations, arr); print(iterations, arr); set_time(&t1, &t1, &max_dif); for (size_t i = 0; i < iterations; i++) { sort_a(arr[i]); } set_time(&t1, &t2, &max_dif); print(iterations, arr); fill(iterations, arr); print(iterations, arr); set_time(&t3, &t3, &max_dif); for (size_t i = 0; i < iterations; i++) { sort_b_optimized(arr[i]); } set_time(&t3, &t4, &max_dif); print(iterations, arr); fill(iterations, arr); print(iterations, arr); set_time(&t5, &t5, &max_dif); for (size_t i = 0; i < iterations; i++) { sort_c(arr[i]); } set_time(&t5, &t6, &max_dif); print(iterations, arr); printf("%ld\n%ld\n%ld\n", t2 - t1, t4 - t3, t6 - t5); printf("%ld %%\n%ld %%\n%ld %%\n", (t2 - t1) * 100 / max_dif, (t4 - t3) * 100 / max_dif, (t6 - t5) * 100 / max_dif); return 0; } Jetzt kann man es übersetzen mit gcc -Wall main.c -o main oder gcc -O0 -Wall main.c -o main oder gcc -O3 -Wall main.c -o main. Das Ergebnis ist in allen drei Fällen (bei mir), dass ich nicht schneller bin als qsort... aber immerhin etwas schneller als SelectionSort (für n=100).
    • String in 2 Schleifen auseinanderpflücken
      C++ (alle ISO-Standards) • • thuering  

      3
      0
      Stimmen
      3
      Beiträge
      105
      Aufrufe

      @Th69 Danke! Ich war gestern wohl zu müde...
    • E

      Funktionales Bewusstsein für ein Programm mit lokaler KI
      Projekte • • Erhard Henkes  

      1
      0
      Stimmen
      1
      Beiträge
      5
      Aufrufe

      E

      Ich arbeite aktuell an einem lokalen „Wissens-Agenten“ auf meinem Windows-Rechner, der drei Dinge kombiniert: Lokale LLMs über Ollama (z. B. gemma3:4b/12b, qwen2.5) Online-Wikipedia + Wikidata als Faktenbasis (RAG-Ansatz) Eine einfache, aber durchgängige „funktionale Bewusstseins-Architektur“ in C# / WinForms Das Projekt heißt aktuell WikipediaRagWinForms und besteht grob aus: RAG-Engine: Wikipedia-Suche, Artikelauswahl, Chunking, Embeddings, Cosine-Similarity, Ranking „FactGuard“: filtert oder relativiert Aussagen, die im Kontext nicht belegt sind Bewusstseins-Schicht („ConsciousnessController“): SelfModel (Fokus, Müdigkeit, Neugier, Bias etc.) ValueSystem (Accuracy, Efficiency, Coherence, Curiosity …) MemoryBank (Episoden mit Frage, Kontext, Antwort, Reflexion, Fehlertypen) GlobalWorkspace (aktueller „Arbeitsbereich“ mit Frage, Suchbegriffen, Artikeln, Wikidata-Fakten usw.) Langzeitmodell (selfmodel_longterm.json) mit Themen-Statistik, Fehlermustern und Modellstärken Pro Episode läuft eine kleine Reflexion (Scores für Vollständigkeit, Kontextabdeckung, Intent-Konsistenz), die wiederum SelfModel + ValueSystem + LongTerm beeinflusst. Der Agent speichert jede Frage als „Episode“ inkl. Meta-Daten (Intent, verwendete Artikel, FactGuard-Hinweise, Fehlertypen). Darauf aufbauend passt er sein Verhalten leicht an (z. B. vorsichtiger werden bei Halluzinationsmustern, mehr/ weniger Exploration, andere RAG-Schwellenwerte etc.). Zusätzlich gibt es ein paar „Easter Eggs“, die den aktuellen inneren Zustand und die Fehlerbilanz als Textbericht ausgeben. Technik kurz: Sprache: C# (.NET, WinForms), aber die Architektur ist prinzipiell auch auf C++ übertragbar Backend: Ollama-REST (lokale LLMs), Wikipedia/Wikidata-API Speicherung: JSON-Dateien (selfmodel.json, selfmodel_longterm.json, values.json, episodes.json, workspace_last.json) Wofür ich Mitstreiter suche: Leute, die Spaß an Architekturen für künstliches Bewusstsein / Meta-Kognition haben Diskussion über sinnvolle Metriken und Lernregeln (wann sollte der Agent z. B. wirklich seine Strategie ändern?) Kritische Durchsicht: wo sind Denkfehler, wo ist das nur „schönes Gefrickel“, wo lässt sich etwas tatsächlich verallgemeinern? Es geht mir explizit nicht darum, „echtes Bewusstsein“ zu erreichen oder zu postulieren, sondern ich will mit überschaubaren Mitteln ein System bauen, das seinen eigenen Umgang mit Wissen, Fehlern und Kontext explizit modelliert und – wenn auch minimal – adaptiv darauf reagiert. Damit es auf einem PC mit 8GB VRAM Graka mit akzeptablen Antwortzeiten läuft, habe ich vor allem gemma3:4b eingesetzt. Ich verwende MS VS 2022 mit C#/WinForms. Wenn jemand Lust hat, mitzudenken oder mitzucoden (Architektur, bessere Reflexions-/Lernmodule), würde ich mich freuen.