看板 C_and_CPP 關於我們 聯絡資訊
小弟最近在練習用 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