作者Neisseria (Neisseria)
看板C_and_CPP
標題[討論] 結合 Lua 和平行運算程式
時間Fri Feb 3 14:59:42 2017
小弟最近在練習用 Lua 寫一些 toy library
寫到後來就想到和 C 結合看看
節錄我的 C 程式:
typedef struct DoubleVector {
size_t size;
double* vec;
} DoubleVector;
// Some code...
DoubleVector* ds_double_vector_add(DoubleVector* v1, DoubleVector* v2) {
size_t len1 = v1->size;
size_t len2 = v2->size;
if (len1 != len2) {
return NULL;
}
DoubleVector* v = ds_double_vector_new(len1);
#pragma omp parallel for
for (int i = 0; i < len1; i++) {
ds_double_vector_set(v, i,
ds_double_vector_get(v1, i) + ds_double_vector_get(v2, i));
}
return v;
}
void ds_double_vector_set(DoubleVector* v, size_t index, double data) {
if (index > v->size - 1) {
fprintf(stderr, "Index out of range\n");
return;
}
v->vec[index] = data;
}
double ds_double_vector_get(DoubleVector* v, size_t index) {
if (index > v->size - 1) {
fprintf(v, "Index out of range\n");
return 0.0;
}
return v->vec[index];
}
// Some code...
當然,這樣的程式不太實用,只是練平行程式用的,就別太計較了 Orz
當我的 C 程式用 OpenMP 時,可以順利編譯
但從 Lua 呼叫時,程式會 seg fault
[Update]
後來跟據 LuaJIT 作者在某個 forum 的回答,加入以下兩修正方式
1. 編譯 LuaJIT 時,加入以下敘述:
make TARGET_FLAGS=-pthread
2. 在呼叫該函式的 Lua 程式尾部加上
os.exit(0)
這個解法不太優雅,總不可能要使用函式庫的人
都用這樣的條件編譯 LuaJIT 和加上這個結尾
但至少目前可以順利跑完程式
我的想法是改用別的平行程式函式庫看看
如果順利,再來版上分享
查了一下在 Lua 下寫平行程式,似乎不太方便
如果要寫多執行緒程式,大概都是開多個 Lua 虛擬機,然後再互傳 message
[Update]
節錄 Lua users wiki 有關於 multithreading programming 的內容:
ANSI C, the standard to which Lua complies, has no mechanism for managing
multiple threads of execution. Threads and the synchronization objects used to
control them are provided by the underlying operating system. You'll need to
use these in order to implement threading in Lua. You will not need to modify
the Lua distribution to do this.
...
Each thread in C which interacts with Lua will need its own Lua state. Each of
these states has its own runtime stack. When a new C thread is started, you can
create its Lua state in one of two ways. One way is to call lua_open. This
creates a new state which is independent of the states in other threads. In
this case, you'll need to initialize the Lua state (for example, loading
libraries) as if it was the state of a new program. This approach eliminates
the need for mutex locks (discussed below), but will keep the threads from
sharing global data.
The other approach is to call lua_newthread. This creates a child state which
has its own stack and which has access to global data.
...
簡單地說,因 ANSI C 不提供 multithread 的機制,所以 Lua 也沒有實作相關機制
如果需要 multithread program 就要從其他方面著手
而 SciLua 也有 vector 和 matrix 運算的函式庫
查了一下原始碼,內部呼叫 OpenBLAS
雖然不確定 SciLua 有沒有用多執行緒在跑
但 OpenBLAS 本身的確有多執行緒
可能是我程式本身的問題
因為這個程式使用同一塊 memory block 也沒特別做保護
最近才開始練平行程式,有更好的寫法歡迎指教
但我也不確定 Lua 是否適合撰寫這樣的程式
所以上來和各位大大討論
先在這裡謝過各位大大
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.66.16
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1486105185.A.EEE.html
推 littleshan: lua state 並不是 thread safe, 他對多緒環境一無所知 02/03 19:05
的確如此
※ 編輯: Neisseria (59.115.66.16), 02/03/2017 20:52:17
推 LPH66: lua 是有個 coroutine, 不過那跟平行是完全兩碼子事 02/03 21:31
的確如此,號稱 cooperative multithreading 其實就是輪流執行
※ 編輯: Neisseria (59.115.66.16), 02/04/2017 10:33:31