Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 15:42

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Ср фев 09, 2022 19:43 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
А что вы хотели?
Чтобы форт умел сам в обход ОС выделять память в куче?
Это придирка даже не к форту, а ко всем всевозможным биндингам в куче языков.
И да каждый фортер решал такими словами наработками собственную задачу, только и всего.
Да. Хочется получить слово, дающее нужный возможный объём памяти.
Я не только хочу решить свою задачу, но и иметь такую возможность для Форта, без всяких заморочек.
Другие ЯП решают же такие вопросы, отчего пользуются популярностью.
Цитата:
Рассматривали MySQL в качестве рабочей лошадки?
Без вариантов.
Оптимальная реализация - FPGA. Слишком экзотический алгоритм - 1024 бит за такт обработать. (мечты пока)
Никакой мощности ПК + GPU, не решит поставленной задачи эффективно, особенно по компактности и энергопотреблению.
В идеале - СБИС. Но делать специализированно под какой камень ещё рано.
Это пока факультатив, и делается для себя в кайф. Думаю тут такое встречается. :)
Цитата:
1) Можно опять же с помощью API записывать все значения в файл.
2) Распараллелить дело хорошее. С чтением проблем нет, а вот с записью могут быть тормоза. Слова для создания потоков в СПФ есть. Можно и семафор впихнуть для душевного спокойствия.
3) Рутина это те самые сложные вычисления?
1) Файл - это медленно, даже на рам-диске. Хотя выбрать из таблицы в файле можно быстрее, чем считать час.
Надо будет подумать для краткосрочной перспективы.
2) Т.е. отдельное слово не сможет использовать отдельное ядро...
Неплохо бы такие примеры. :)
3) Сложные вычисления заменяются либо на вычислитель в FPGA с большо-ооооой разрядностью,
либо на большой объём памяти - выбирать результаты по заранее высчитанным индексам.
Это, типа, как радужные таблицы.
Я когда-то купил GA144 пачку для этого, но покопавшись выяснил, что не подходят для моей задачи.
Так и валяются в чулане. :(

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 10, 2022 15:49 
Не в сети

Зарегистрирован: Чт июн 03, 2021 16:13
Сообщения: 26
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Sotnik писал(а):
Да. Хочется получить слово, дающее нужный возможный объём памяти.

VirtualAlloc() вам в помощь. Можете запросить больше чем установлено физической памяти. ОС будет подкачивать вам страницы сама. Но при произвольном доступе к веделенному блоку ясное дело будет замедление если у вас винт не SSD.

Писать все в файл (или в файлы) тоже не плохая мысль. Тогда с помощью MapViewOfFile() можно отображать "окно" в память и двигать его по файлу. По-сути, тут вы делаете что-то вроде собственного свопа только вы можете заточить его под ваш алгоритм.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 10, 2022 23:15 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Blackice писал(а):
Sotnik писал(а):
Да. Хочется получить слово, дающее нужный возможный объём памяти.
VirtualAlloc() вам в помощь. Можете запросить больше чем установлено физической памяти. ОС будет подкачивать вам страницы сама.
Но при произвольном доступе к выделенному блоку ясное дело будет замедление если у вас винт не SSD.
Винда путается под ногами.
Не нужна эта прослойка, но...
Blackice писал(а):
Писать все в файл (или в файлы) тоже не плохая мысль. Тогда с помощью MapViewOfFile() можно отображать "окно" в память и двигать его по файлу.
По-сути, тут вы делаете что-то вроде собственного свопа только вы можете заточить его под ваш алгоритм.
Не нужна эта прослойка, но...

Radeon_RAMDisk_4_4_0_RC36.msi
Создал виртуальный диск на 4 гега, более не делает.
Буду пробовать.

Возможно прочитать из файла виртуального диска напрямую из памяти, или винда не даст?

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 12:32 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
М-да, чудных идей полнится мир наш.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 15:09 
Не в сети

Зарегистрирован: Чт июн 03, 2021 16:13
Сообщения: 26
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Sotnik писал(а):
Возможно прочитать из файла виртуального диска напрямую из памяти, или винда не даст?

Неважно, где создан диск - в памяти или на физ. носителе, винда предоставляет к нему доступ через ситему драйверов и апи верхнего уровня. Так что скорее всего не даст. Если у вас такая специфическая задача, то под нее нужно поставить соответсвующее железо.

Только что проверил, при установленных 16 Гб в системе, винда легко отдает 8 Гб одним блоком в полное распоряжение.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 15:34 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Blackice писал(а):
Sotnik писал(а):
Возможно прочитать из файла виртуального диска напрямую из памяти, или винда не даст?
Только что проверил, при установленных 16 Гб в системе, винда легко отдает 8 Гб одним блоком в полное распоряжение.
Пример можно?!! :)

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 15:51 
Не в сети

Зарегистрирован: Чт июн 03, 2021 16:13
Сообщения: 26
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Да пожалуйста, только он на С...

Код:
#include "windows.h"
#include "stdio.h"

typedef unsigned __int64 qword;
typedef unsigned char byte;
typedef byte*         lpbyte;

int main()
{
    qword size = 8589934592; // 8 Gb
   
    lpbyte pMem = (lpbyte)VirtualAlloc( NULL, size, MEM_COMMIT, PAGE_READWRITE );
   
    if( pMem )
    {
        printf( "Allocated: %llu bytes\n", size );
       
        printf( "Writting...\n" );
        for( qword i = 0; i < size; i++ )
        {
            pMem[i] = (byte)i;
        }

        printf( "Reading...\n" );
        for( qword i = 0; i < size; i++ )
        {
            byte value = pMem[i];
            if( value != (byte)i )
            {
                printf( "Read error: %u != %u at [%llu]\n", value, (byte)i, i );
            }
        }

        printf( "Deallocating...\n" );
        VirtualFree( pMem, size, MEM_RELEASE );
    }
    else
    {
        printf( "Memory allocation failed!\n" );
    }

    return 0;
}



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 15:59 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Blackice писал(а):
Да пожалуйста, только он на С...
Спасибо, конечно, большое. :)
Код:
\ Глобальная память, разделяемая между потоками      d:\spf4-20\devel\~yz\lib\gmem.f
\ Идея реализации - А. Черезов
\ Ю. Жиловец, 17.12.2002     

REQUIRE CZMOVE ~yz/lib/common.f
MODULE: GMEM
EXPORT
: MALLOCATE   ( u -- u-addr/0)  8 ( HEAP_ZERO_MEMORY) GetProcessHeap HeapAlloc ;
: MFREE         ( a-addr -- ?)     0 GetProcessHeap   HeapFree ;
: MGETMEM     ( u -- a-addr )    MALLOCATE   DUP IF 0 ELSE -300 THEN THROW ;
: MFREEMEM    ( a-addr -- )       MFREE ERR THROW ;
: CMGETMEM   ( a n -- a2)         DUP 1+ MGETMEM   2DUP C! DUP >R 1+ SWAP CMOVE R> ;
: CZMGETMEM ( a n -- a)           DUP 1+ MGETMEM     DUP >R CZMOVE R> ;
: ZMGETMEM     ( z -- a)          ASCIIZ> CZMGETMEM ;
;MODULE
Как работают эти слова?
На них можно получить?

Я уже писап, что в других ЯП это получается легко. :(

Хочется получить слово, дающее нужный возможный объём памяти.
Я не только хочу решить свою задачу, но и иметь такую возможность для Форта, без всяких заморочек.
Другие ЯП решают же такие вопросы, отчего пользуются популярностью.

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 17:53 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Напишите в СПФ:
WINAPI: VirtualAlloc KERNEL32.DLL

и пользуйтесь словом VirtualAlloc на здоровье.

https://docs.microsoft.com/en-us/window ... rtualalloc

Цитата:
Другие ЯП решают же такие вопросы, отчего пользуются популярностью.

Вот Blackice привел пример на Си. В каком месть этот язык решает подобный вопрос? Да вообще ни к ваком, просто в windows.h есть экспорт функции из KERENEL32
Вот и весь сказ.

Цитата:
Я не только хочу решить свою задачу, но и иметь такую возможность для Форта, без всяких заморочек.

В том же СПФ есть функция для экспорта функций из DLL
Если вы хотите форт, который может выдать +100500 гигабайтов, избегая при этом участия операционной системы, то пишите на здоровье. Фортер здорового человека не брезгует лезть в документацию к DLL и экспортировать из них требуемые функции.
Фиг с ним память, как вы, например, OpenGL сотворите без вызова внешних функций или hello word передать по сокету?

_________________
Цель: сделать 64-битную Нову под Винду



За это сообщение автора Victor__v поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 19:33 
Не в сети

Зарегистрирован: Чт июн 03, 2021 16:13
Сообщения: 26
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
На Форт задача решается так же просто (но менее популярно). Перевел практически дословно пример С на Форт. Все отлично работает. Только обратите внимение, мой форт 64 битный, соответсвенно на 32х битах работать не будет.
Код:
KERNEL32.DLL C-FUNCTION VirtualAlloc LPVOID QWORD QWORD QWORD -- LPVOID
KERNEL32.DLL C-FUNCTION VirtualFree LPVOID QWORD QWORD -- BOOL

8589934592 CONSTANT 8Gb
0x1000     CONSTANT MEM_COMMIT
0x8000     CONSTANT MEM_RELEASE
0x04       CONSTANT PAGE_READWRITE

: 8Gb-Alloc-Test ( -- ) {: | pMem -- pointer to memory block :}
    0 8Gb MEM_COMMIT PAGE_READWRITE VirtualAlloc ?DUP IF
        TO pMem

        ." Allocated: " 8Gb . SPACE ." bytes" CR
       
        ." Writting... " CR
        8Gb 0 DO
            I DUP pMem + C!
        LOOP

        ." Reading... " CR       
        8Gb 0 DO
            I pMem + C@ I 0xFF AND <> IF
                ." Read error at: " I . CR
            THEN
        LOOP
         
        ." Deallocating..." CR
        pMem 8Gb MEM_RELEASE VirtualFree DROP
    ELSE
        ." Memory allocation error!" CR
    THEN
;



За это сообщение автора Blackice поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 11, 2022 20:02 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Blackice

Код:
KERNEL32.DLL C-FUNCTION VirtualAlloc LPVOID QWORD QWORD QWORD -- LPVOID
KERNEL32.DLL C-FUNCTION VirtualFree LPVOID QWORD QWORD -- BOOL


Было бы интересно посмотреть реализацию этого под 64 бита.

Как понимаю KERNEL32.DLL это константа, а, например, LPVOID QWORD QWORD QWORD неявно дают понять сколько аргументов у функции, но сами аргументы непосредственно не участвуют в компиляции обёртки.

И там точно Cdecl, а не вызов с передачей через регистры RCX RDX R9 R10 ?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Сб фев 12, 2022 00:33 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
Напишите в СПФ: WINAPI: VirtualAlloc KERNEL32.DLL и пользуйтесь словом VirtualAlloc на здоровье.
Подключил. :)
Victor__v писал(а):
Вот Blackice привел пример на Си. В каком месть этот язык решает подобный вопрос?
Да вообще ни к ваком, просто в windows.h есть экспорт функции из KERENEL32
Вот и весь сказ.
У нас для Форта нет сказа. Для своих языков миллионы программистов давно решили такие вопросы.
Цитата:
Я не только хочу решить свою задачу, но и иметь такую возможность для Форта, без всяких заморочек.
Вот весь сказ. Работа с памятью - штатная функция (должна быть) любого языка.
Потому и прошу помощи, видя что на си это решилось моментально.
Victor__v писал(а):
В том же СПФ есть функция для экспорта функций из DLL
Если вы хотите форт, который может выдать +100500 гигабайтов, избегая при этом участия операционной системы, то пишите на здоровье.
Фортер здорового человека не брезгует лезть в документацию к DLL и экспортировать из них требуемые функции.
Фиг с ним память, как вы, например, OpenGL сотворите без вызова внешних функций или hello word передать по сокету?
"по сокету"? Я не знаю Си. Я не избегаю ОС, а работаю с Фортом. Надо подключить - подключу.
Только надо знать что и как.

Я не работаю с виндой. И только Форт мне позволяет решать математические задачи.

Понадобилось больше памяти, а мне предложили изучить винду.
Ради одной функции...

А вообще спасибо за чёткие внятные ответы!!! :)

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Сб фев 12, 2022 00:36 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Blackice писал(а):
На Форт задача решается так же просто (но менее популярно). Перевел практически дословно пример С на Форт. Все отлично работает. Только обратите внимение, мой форт 64 битный, соответсвенно на 32х битах работать не будет.
Где взять?

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пн фев 14, 2022 23:26 
Не в сети

Зарегистрирован: Чт июн 03, 2021 16:13
Сообщения: 26
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Victor__v писал(а):
Blackice
Код:
KERNEL32.DLL C-FUNCTION VirtualAlloc LPVOID QWORD QWORD QWORD -- LPVOID
KERNEL32.DLL C-FUNCTION VirtualFree LPVOID QWORD QWORD -- BOOL

Было бы интересно посмотреть реализацию этого под 64 бита.

Как понимаю KERNEL32.DLL это константа, а, например, LPVOID QWORD QWORD QWORD неявно дают понять сколько аргументов у функции, но сами аргументы непосредственно не участвуют в компиляции обёртки.

И там точно Cdecl, а не вызов с передачей через регистры RCX RDX R9 R10 ?


Вы уже сами практически ответили на свой вопрос. В двух словах. KERNEL32.DLL - слово возвращает системный указатель (HANDLE) на длл. Слово C-FUNCTION загружает из длл указынный метод. Слово -- завершает компиляцию вызова. Сами системные вызовы реализованны в примитивах, с передачей параметров через RCX, RDX, R8, R9 (никаких cdecl, stdcall, fastcall в 64 битах нет). LPVOID, QWORD, BOOL служат для более явного синтаксического сахара и помогают понять сколько аргументов принимает системный метод и возвращает ли он значение: : LPVOID 1+ ; и т.п. Все это реализовано на чистом Форт. На уровне примитивов реализуются обертки для системных вызовов и вспомогательное слово (API0), которое возвращает на стек адресс памяти в которую загрузчик ложит адресса 2х базовых методов - LoadLibrary и GetProcAddress. Так осуществляется раскрутка всей системы.

Sotnik писал(а):
Где взять?


Пока нигде. У меня есть мысль в будущем все это выложить сюда, но пока "мой форт" еще не готов уйти в свободное плавание. Да и он далек от стандарта. А вы не хотите попробовать gforth? Он 64 битный и возможно "самый стандартный форт в мире". Байндинг к системным апи дожен быть.



За это сообщение автора Blackice поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: gforth
СообщениеДобавлено: Вт фев 15, 2022 10:50 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Blackice писал(а):
попробовать gforth? Он 64 битный и возможно "самый стандартный форт в мире". Байндинг к системным апи дожен быть.
Цитата:
Не пошло. Кот в мешке. Потому желательно с поддержкой. :)
Потому сейчас и "дую на воду"...
Тут подкинули ссылку
Давно я на него не обращал внимания.
Посмотрел - забираю свои слова обратно.
Спасибо за совет! :)

_________________
Сотник. SotnikSTO@mail.ru


Последний раз редактировалось Sotnik Чт фев 17, 2022 00:23, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB