我想制作一個具有 OpenMP 一些非常基本功能的基本庫。例如,只是為了能夠撰寫如下代碼。我想知道如何使用 LLVM 和 pthreads 來實作這一點。我想有兩個步驟:
- 預處理以找出并行任務(并行與并行)
- 將適當的代碼塊轉換為 pthread 所需的 void* 函式
- 自動化創建、運行和加入執行緒
示例代碼:
#Our_Own parallel
{
printf("hello");
}
#Our_Own parallel for
for (int i =0; i < 1000; i )
{
printf(i);
}
uj5u.com熱心網友回復:
在 C 中無需使用編譯指示來實作并行回圈(或任務)。您可以在Threading Building Blocks (TBB) 或Kokkos的實作中看到這一點,它們都提供了并行性而不使用 pragma。因此,無需對編譯器進行任何修改即可執行此操作!
這里的關鍵觀察是 C 提供了 lambda,它允許您將一段代碼抽象為匿名函式,并從背景關系中系結適當的變數,以便以后可以在其他執行緒中呼叫它。
即使您確實想映射到編譯指示,例如提供您自己的“改進”版本的 OpenMP,您也可以通過使用_Pragma指令來做到這一點,而無需使用 C 宏以外的任何東西,該指令可以放置在宏中,像這樣:-
#include <stdio.h>
#include <omp.h>
#define STRINGIFY1(...) #__VA_ARGS__
#define STRINGIFY(...) STRINGIFY1(__VA_ARGS__)
#define MY_PARALLEL _Pragma("omp parallel")
#define my_threadID() omp_get_thread_num()
int main (int, char **)
{
MY_PARALLEL
{
printf ("Hello from thread %d\n", my_threadID());
}
return 0;
}
但是,我們對您真正想要實作的目標以及在什么情況下一無所知:
- 由于幾乎所有 OpenMP 實作都位于 pthread 之上,為什么您需要一些不同的東西?
- 這是針對哪種語言的?(C、C 、其他?)
- 避免使用現有實作(例如 TBB、RAJA、Kokkos、C 并行演算法)的原因是什么?
請記住,“最好的代碼是我不必撰寫的代碼”。
(如果您想查看您正在處理的事情的型別,請查看Little OpenMP 運行時,它實作了一些(不是全部)CPU OpenMP 要求,以及相關的書籍。)
uj5u.com熱心網友回復:
免責宣告:這是一項非常艱巨的任務,并且涉及到許多隱藏任務(如何訪問變數并設定它們的共享屬性、隱式屏障、同步等)。我并不聲稱您可以使用該思想解決所有問題如下面所描述的。
如果您使用(python)腳本來預處理您的代碼,這里有一個非常簡單的示例,如何從 C 語言開始(由于 lambda 函式,C 可能會更容易一些)。
使用宏定義(最好將它們放在頭檔案中):
// Macro definitions (in own.h)
#define OWN_PARALLEL_BLOCK_START(f) \
void *f(void * data) \
{ \
#define OWN_PARALLEL_BLOCK_END \
return NULL; \
}
#define OWN_PARALLEL_MAIN(f) \
{ \
int THREAD_NUM=4; \
pthread_t thread_id[THREAD_NUM]; \
for(int i=0;i<THREAD_NUM;i ) { \
pthread_create(&thread_id[i], NULL, f, NULL); \
} \
for(int i=0;i<THREAD_NUM;i ) { \
pthread_join(thread_id[i], NULL); \
} \
}
您的 (python) 腳本應將其轉換為:
int main(){
#pragma own parallel
{
printf("Hello word\n");
}
}
到以下:
OWN_PARALLEL_BLOCK_START(ThreadBlock_1)
{
printf("Hello word\n");
}
OWN_PARALLEL_BLOCK_END
int main(){
OWN_PARALLEL_MAIN(ThreadBlock_1)
}
在編譯器資源管理器上檢查它
uj5u.com熱心網友回復:
我想制作一個具有 OpenMP 一些非常基本功能的基本庫。
不,你真的不會。至少,因為您正在考慮的任何型別都不能準確地描述為“基本”或(僅)“庫”。
已經有多種不錯的替代方案可用,尤其是 OpenMP 本身。使用其中之一。或者,如果您堅持自己滾動,那么在理解您正在承擔一個重大專案的情況下這樣做。
例如,只是為了能夠撰寫如下代碼。我想知道如何使用 LLVM 和 pthreads 來實作這一點。我想有兩個步驟:
- 預處理以找出并行任務(并行與并行)
是的,但不是C前處理器。它還不夠強大。您需要一個對目標語言(C?C ?)有足夠語意理解的源到源翻譯器來識別您的注釋和它們所應用的源結構,并應用所需的轉換和工具。
我認為 LLVM 專案包含有助于解決此問題的部分(例如,您可能不需要從頭開始撰寫 C 決議器)。
- 將適當的代碼塊轉換為 pthread 所需的 void* 函式
是的,這將是所需的轉換之一。
- 自動化創建、運行和加入執行緒
是的,這也是所需的轉換之一。
但這些還不是全部。例如,對于并行for情況,您還需要考慮在多個執行緒之間拆分回圈迭代。您可能還需要一個解決方案來識別和管理對共享變數的訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504219.html
