簡體   English   中英

創建線程之前的Pthread親和性

[英]Pthread affinity before create threads

我需要在創建線程之前設置親緣關系(線程到核心,例如:第一個線程到第一個核心)。 OpenMP KMP_AFFINITY 可能嗎?

編輯:我試試這種方式,但不要工作:/

void* DoWork(void* args)
{
    int nr = (int)args;
    printf("Wątek: %d, ID: %d, CPU: %d\n", nr,pthread_self(), sched_getcpu());  
}


int main()
{   
    int count = 8;
    pthread_t threads[count];

    pthread_attr_t attr;
    cpu_set_t mask;
    CPU_ZERO(&mask);
    pthread_attr_init(&attr);

    for (int i = 0; i < count ; i++)
         CPU_SET(i, &mask);

    pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &mask);

    for(int i=0; i<count ; i++)
    {

        pthread_create(&threads[i], &attr, DoWork, (void*)i);
    }

    for(int i=0; i<count ; i++)
    {
        pthread_join(threads[i], NULL);
    }
}

如前所述,您應該使用pthread_attr_setaffinity_np將線程綁定到特定核心。 可以檢索系統中可用的CPU核心數(請參閱下面的代碼)。

在使用pthread_create創建線程時,每次必須傳遞使用適當的cpu_set_t設置的pthread_attr_t實例。 每次你必須清除cpu_set_t或刪除先前輸入的數字(我選擇前一個選項),然后再將下一個CPU核心標識符添加到集合中。 如果要確定線程將在哪個CPU上執行,請在創建線程時在集合中只需要一個CPU(參見下面的代碼)。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* DoWork(void* args) {
    printf("ID: %lu, CPU: %d\n", pthread_self(), sched_getcpu());
    return 0;
}

int main() {   

    int numberOfProcessors = sysconf(_SC_NPROCESSORS_ONLN);
    printf("Number of processors: %d\n", numberOfProcessors);

    pthread_t threads[numberOfProcessors];

    pthread_attr_t attr;
    cpu_set_t cpus;
    pthread_attr_init(&attr);

    for (int i = 0; i < numberOfProcessors; i++) {
       CPU_ZERO(&cpus);
       CPU_SET(i, &cpus);
       pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);
       pthread_create(&threads[i], &attr, DoWork, NULL);
    }

    for (int i = 0; i < numberOfProcessors; i++) {
        pthread_join(threads[i], NULL);
    }

    return 0;
}

您可以調用pthread_self()來獲取主線程的線程ID,並在pthread_setaffinity_np中使用它。

您可以使用pthread_attr_setaffinity_nppthread_create函數設置關聯屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM