내 프로그램을 실행하기 전에, 나는이 작업을 수행 :OpenMP에서 특정 스레드 ID를 고유 한 태스크 그룹으로 그룹화 할 수 있습니까?
#pragma omp parallel num_threads(48)
{
int id = omp_get_thread_num();
}
병렬 구조의 각 스레드는 이제 프로세서 ID와 일치하는 ID가 있습니다
export KMP_AFFINITY=explicit,proclist=[0-47],granularity=fine
나는 다음 48 개 스레드를 생성. 지금
...프로세서 0 및 프로세서 (24)는 동일한 코어에 실제로. 프로세서 24에서 47까지는 0에서 23까지 하이퍼 스레딩되어 있습니다.
스레드가 사용하는 작업자 개체의 벡터가 있습니다. 그들은 자신의 ID를 기반으로 벡터에서 객체를 선택합니다.
하이퍼 스레드 된 코어가 특정 "작업자"개체와 쌍을 이루도록 시도한 다음 개체 내에서 작업 그룹을 사용하려고합니다.
class Worker {
public:
int wId;
Worker(int i) {
wId = i;
}
void doWork() {
// Can I make a task group for the 2 threads reaching this code together?
// will barriers, taskgroups, critical pragmas wait for all 48 threads?
}
};
int main() {
vector<Worker> workers;
for (int i = 0; i < 48; ++i) {
Worker w(i);
workers.push_back(w);
}
#pragma omp parallel num_threads(48)
{
int id = omp_get_thread_num();
workers[id % 24].doWork();
}
}
이와 같은 기능이 작동하는지 잘 모르겠습니다. 내 가정은 해당 doWork()
함수 내에서 taskgroup
또는 barrier
또는 critical
pragma를 사용하면 객체를 공유해야하는 2 개의 스레드가 아닌 48 개의 모든 스레드에 영향을 미친다는 것입니다.
사실인가요? 내가 원하는 것을 수행하기 위해 알려진 프로세서 바인딩 (예 : 스레드 0과 스레드 23을 그룹에 넣음) 된 스레드 그룹을 만들려면 어떻게해야합니까?
당신이 24 개 스레드의 첫 번째 수준으로, 중첩 된 병렬 처리를 고려 했
그리고이 다음은이 작업을 수행 할 수 있습니다 (코어에 연결됨) 및 2 단계 스레드의 두 번째 레벨 (동일한 코어의 2 개의 하이퍼 스레드를 사용합니다)? – Gilles
@ Gilles - 예, 지금 테스트하려고하는 것이지만, 0/24, 1/25 등의 쌍을 동일한 코어에 고정하는 방법을 모르겠습니다. 나는 그것이'KMP_AFFINITY'와'num_threads' 인자에 대한 변경을 요구할 것임을 압니다.하지만 이것들을 정확히 설정하는 것이 확실하지 않습니다. – tmsimont