Octave + C(thread)

0

Cześć!

Programując już kilka lat w octavie ciągle brakowało mi wątków. Co jakiś czas przegrzebywałem internet ale nic na ten temat nie znajdowałem.
Dziś postanowiłem sprawdzić czy to jest możliwe. Stworzyłem na szybko funkcję:

#include <octave/oct.h>
#include <octave/parse.h>
#include <pthread.h>

struct eval_data_t{
	octave_function *func;
};

void * eval(void *p){
	octave_value_list newargs;
	struct eval_data_t * data = (struct eval_data_t *)p;
	feval(data->func, newargs, 0);
	free(data);
	return 0;
}

DEFUN_DLD(func1, args, nargout, "Func1"){
	pthread_t thread;
	struct eval_data_t * data;
	
	data = (struct eval_data_t *)malloc(sizeof(struct eval_data_t));
	data->func = args(0).function_value();
	pthread_create(&thread, NULL, eval, (void*)data);

	return octave_value_list();
}

Odpaliłem:

function test2()
	global a;
	a = 0;
	
	func1(@foo);
	sleep(0.3);
	
	a = 5;
end

function foo()
	global a;
	a = 2;
	for i=1:10
		disp(['Foo ', num2str(a)]);
		fflush(stdout);
		sleep(0.1);
	end
end

I uzyskałem oczekiwany wynik:

octave:38> test2();
Foo 2
Foo 2
Foo 2
octave:39> Foo 5
Foo 5
Foo 5
Foo 5
Foo 5
Foo 5
Foo 5

Ekstra, jest to możliwe!
Pozostaje tylko ładnie ponazywać funkcję, obsłużyć błędy, upodobnić do POSIX'owego pthread'a, plus ewentualnie jakieś mutexy.

Pytanko, czy jest sens? Czy na pewno nie ma wątków w octavie?
Poszło mi to dość łatwo i dziwię się że nie mogę znaleźć gotowego rozwiązania...

0

"Bibliteczka" wstępnie napisana, lecz po kilku testach lipa.
Interpretator octavy nie jest jednak gotowy na wątki w takim stopniu.
Jak funkcje mają coś więcej popisane, nawet coś co jest niezależne, kończy się crashem.

function test2()
	thread_create(@foo)
	plot(1:10, 1:10); % crash :(
	sleep(1);
end

function foo()
	for i=1:10
		disp(['Foo ', num2str(i)]);
		fflush(stdout);
		sleep(0.1);
	end
end

:(

0

Parę aspektów o których musisz wiedzieć zawczasu:

  1. Octave całkiem dobrze sobie radzi ze zrównoleglaniem obliczeń, bez tego typu wynalazków. Używa do tego tzn. instrukcji SIMD.
  2. Czy jesteś pewien, że potrzebujesz tego typu rozwiązań?
  3. Dlaczego nie użyjesz jakiegoś z gotowych rozwiązań jak ATLAS, MPI lub parallel?
0

Często w octavie symuluję w czasie rzeczywistym.
Podpinam urządzenie, zbieram dane, obrabiam i odsyłam.
Chciałbym aby w jednym wątku było odbieranie danych, obrabianie i wysyłanie a w drugim wyświetlanie danych na wykresie - to wszystko w czasie rzeczywistym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1