2015-08-13 3 views
2

Основные отличия между thread-local storage (TLS) и partitioned global address space (PGAS)? Каковы последствия использования языков или программ с использованием одного или другого?В чем разница между TLS и PGAS?

+0

Это очень разные понятия. Можете ли вы найти определения каждого и попытаться задать более конкретный вопрос? – Jeff

+0

@Jeff Я спросил, потому что я уже сделал это (см. Ссылки) и не был уверен в различиях. Я думал, что PGAS похож на TLS (который, я думаю, я понимаю). TLS сохраняет память локально для каждого потока, но обычно существуют механизмы для обработки глобальных/общих переменных. PGAS имеет глобальное адресное пространство, но разделяет его таким образом, который кажется очень похожим на TLS. Часть объяснения википедии PGAS, которую я не понимаю, это то, где она говорит о локальности ссылки и близости пространства разделяемой памяти. – John

+1

Хорошо, здесь есть поверхностное сходство, но на практике PGAS «потоки» - фактически ОС-процессы. PGAS также поддерживает распределенную память. Я попытаюсь написать правильный ответ, когда я подберу подходящую клавиатуру. – Jeff

ответ

2

Это, по крайней мере, внешне похожие подходы, но практические последствия совершенно разные.

TLS - это то, как можно указать, что автоматические переменные (то есть данные в стеке) связаны с потоками операционной системы (OS) (например, потоками POSIX), а не с целым процессом ОС.

Ниже приведен пример TLS в OpenMP. Я использую OpenMP, потому что потоки C11 еще не поддерживаются GCC или Clang. Эквивалентный синтаксис в C11 (C++ 11) равен _Thread_local (thread_local).

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 

int p; 
#pragma omp threadprivate(p) 
int s; 

int main(int argc, char **argv) 
{ 
    #pragma omp parallel 
    { 
     printf("%d: %p %p\n", omp_get_thread_num(), &p, &s); 
    } 
    return 0; 
} 

На моей машине, выход этого кода:

> OMP_NUM_THREADS=8 ./tls 
1: 0x7fdbb1404ea8 0x1004a5060 
2: 0x7fdbb1500c08 0x1004a5060 
3: 0x7fdbb1500c18 0x1004a5060 
4: 0x7fdbb1500c28 0x1004a5060 
5: 0x7fdbb1500c38 0x1004a5060 
6: 0x7fdbb1500c48 0x1004a5060 
0: 0x7fdbb1500c58 0x1004a5060 
7: 0x7fdbb1500c68 0x1004a5060 

Как вы можете видеть здесь, адрес данных TLS различен на каждом потоке, в то время как адрес глобальных без ДУСА то же самое для всех потоков.

В PGAS обычно используется распределенная память. Данные распределяются конфиденциально для каждого потока (здесь поток может быть потоком ОС, процессом ОС или чем-то еще) по умолчанию. При необходимости можно распределять общие данные.

Ниже приведена программа SHMEM. В этой программе данные sheap являются указателями в каждом PE (обрабатывающем элементе, который обычно является процессом ОС), к которому может обращаться любой другой PE, используя вызовы функций, такие как shmem_getmem и shmem_putmem.

#include <shmem.h> 

int main(int argc, char* argv[]) 
{ 
    start_pes(0); 
    int mype = my_pe(); 
    int npes = num_pes(); 

    int n = (argc>1 ? atoi(argv[1]) : 1000); 
    int * sheap = shmalloc(n*sizeof(int)); 
    if (sheap==NULL) exit(1); 
    printf("PE %d: sheap base = %p\n", mype, sheap); 
    shfree(sheap); 

    return 0; 
} 

В языке PGas как СКП, можно использовать синтаксис нагрузки магазина, но компилятор будет транслировать их в сети функция связи вызывает, если данные живет в отдаленном месте (удаленный означает другой узел в распространять память).

Принципиальное различие между TLS и PGas является то, что TLS работает в резьбовом контексте, где данные разделяемой по умолчанию и TLS используется для ее приватизировать, в то время как в PGas все данные частными по умолчанию и общие данные могут быть выделены по запросу.

Помогает ли это? Я знаю, что примеры C++ 11 и UPC были бы более полезными, чем OpenMP и SHMEM, но было легче написать последнее.

+0

Спасибо, что написал это время. Очень полезно. – John

Смежные вопросы