【问题标题】:For inside for - how to do inner for parallel without spending time on creating threadsFor inside for - 如何在不花时间创建线程的情况下进行内部并行
【发布时间】:2017-01-16 00:40:33
【问题描述】:

我是 OpenMP 的新手,并且 我面临这样的情况:

int someArray[ARRAY_SIZE];

//outer loop
for(int i = 0; i < 100; ++i) {

    //inner loop 
    for(int j = 0; i < ARRAY_SIZE; ++i) {
        //calculaations in someArray (every cell can be calculated separately)
    }

    //some code that needs to be run by only one thread - for example sorting someArray
}

我想让内部循环并行,但我尝试过的想法(下面的代码)无效(单线程可以比多线程更快地做事)。我认为在这里反复创建多个线程需要很多时间。

我的错误解决方案:

int someArray[ARRAY_SIZE];

//outer loop
for(int i = 0; i < 100; ++i) {

    #pragma omp parallel num_threads(THREADS_NUMBER) shared(someArray)
    {
        //inner loop
        #pragma omp for
        for(int j = 0; i < ARRAY_SIZE; ++i) {
            //calculaations in someArray (every cell can be calculated separately)
        }
    }

    //some code that needs to be run by only one thread - for example sorting someArray
}

你知道如何优化这个任务吗?

【问题讨论】:

    标签: c multithreading parallel-processing synchronization openmp


    【解决方案1】:

    当您有双 for 循环时,您几乎总是希望使外部循环并行化。在你的情况下:

    #pragma omp parallel for
    for(int i = 0; i < 100; ++i) {
    
        for(int j = 0; i < ARRAY_SIZE; ++i) {
            //calculations in someArray (every cell can be calculated separately)
        }
    
        //some code that needs to be run by only one thread - for example sorting someArray
    }
    

    如果您有 4 个 CPU 可用,这会将 100 次迭代分成 25 个跨 4 个 CPU。这比您的代码效率高得多,因为您的代码在 100 次迭代中的每一次都将 ARRAY_SIZE 拆分到 CPU 中(因此您有 100 倍的开销)。

    【讨论】:

    • 但是外循环需要在一个线程中,因为在一个循环结束时有数组排序(这是共享资源)。 ARRAY_SIZE 可以约为 6600 万。所以我想要的是仅并行化内部循环(独立重新计算单独的单元格)。
    • 我也尝试过设置屏障,然后是假主人 -> if(0 = thread_number) 但它的声明是非法的。
    • 我需要更多背景信息才能提供帮助 - 你想达到什么目的?您能否详细说明您的示例以显示性能问题?
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多