1

我想知道如何在没有显式线程对象的情况下表达并发性,而不是可能使用线程或线程池的实现,而是与语言设计相关的问题。

Q1:我想知道如果没有线程对象会丢失什么,用这种语言做不到什么?

Q2:我也想知道这将如何表达,提出或实施了哪些方式作为线程的替代或补充?

4

1 回答 1

0

一种可能性是 MPI 程序模型(GPU 也是如此)

假设您有以下代码

for(int i=0; i < 100; i++) {
    work(i);
}

“正常”的基于线程的方式是将迭代范围分成多个子集。所以像这样

线程 1:

for(int i=0; i < 50; i++) {
    work(i);
}

线程 2:

for(int i=50; i < 100; i++) {
    work(i);
}

但是在 MPI/GPU 中,您会做一些不同的事情。这个想法是,每个内核都执行相同的(GPU)或至少类似的(MPI)程序。不同之处在于,每个内核使用不同的 ID,这会改变代码的行为。

mpi 样式:(不完全是 MPI 语法)

int rank = get_core_id();
int size = get_num_core(); 
int subset = 100 / size;
for (int i = rank * subset;i < (rand+1)*subset; i+) {
    //each core will use a different range for i
    work(i);
}

下一件大事是沟通。通常你需要手动使用所有同步的东西。MPI 是基于消息的,这意味着它并不完全适合经典的共享内存模型(每个内核都可以访问相同的内存),但在集群系统(许多内核与网络相结合)中它工作得很好。这不仅限于超级计算机(它们基本上只使用 mpi 风格的东西),而且近年来开发了一种新型的核心架构(manycores)。他们有一个本地所谓的片上网络,因此每个核心都可以发送/接收消息而不会出现同步问题。

MPI 不仅包含简单的消息,还包含更高的构造,以自动将数据分散和收集到每个核心。示例:(同样不是 MPI 语法)

int rank = get_core_id();
int size = get_num_core();
int data[100];
int result;
int results[size];
if (rank == 0) { //master-core only
   fill_with_stuff(data);
}
scatter(0, data); //core-0 will send the data-content to all other cores
result = work(rank, data); // every core works on the same data
gather(0,result,results); //get all local results and store them in 
                          //the results-array of core-0

另一个解决方案是您在此处声明并行块的 openMP 库。整个线程部分由库本身完成

例子:

//this will split the for-loop automatically in 4 threads
#pragma omp parallel for num_threads(4)
for(int i=0; i < 100; i++) {
    work(i);
}

最大的优势是,它的写作速度很快。就是这样,您可以通过自己编写线程获得更好的性能,但是需要更多的时间和有关同步的知识

于 2016-10-20T06:30:48.167 回答