Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C For inside For-如何在不花费时间创建线程的情况下执行inside For并行_C_Multithreading_Parallel Processing_Synchronization_Openmp - Fatal编程技术网

C For inside For-如何在不花费时间创建线程的情况下执行inside For并行

C For inside For-如何在不花费时间创建线程的情况下执行inside For并行,c,multithreading,parallel-processing,synchronization,openmp,C,Multithreading,Parallel Processing,Synchronization,Openmp,我是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) } /

我是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];
//外环
对于(int i=0;i<100;++i){
//内环
对于(int j=0;i
我想使内部循环并行,但我尝试过的想法(下面的代码)并不有效(单线程可以比多线程更快)。我认为,在这里,在腰身上不断地创造多条线需要花费大量的时间

我的错误解决方案:

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
}
int someArray[ARRAY_SIZE];
//外环
对于(int i=0;i<100;++i){
#pragma omp并行线程数(线程数)共享(someArray)
{
//内环
#pragma omp for
对于(int j=0;i

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

当你有双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
}
#pragma omp parallel for
对于(int i=0;i<100;++i){
对于(int j=0;i

如果您有4个CPU可用,这将在4个CPU中将100个迭代拆分为25个。这比您的代码要高效得多,因为在100次迭代中,每一次迭代都会在CPU上拆分数组大小(因此您的开销是100倍)。

但是外部循环需要在一个线程中,因为在循环结束时会进行数组排序(这是schared资源)。阵列_的大小约为66百万。所以我想要的是只对内部循环进行并行化(独立地重新计算单独的单元格)。我还试图设置屏障,然后伪造master->if(0=线程编号),但它的语句是非法的。我需要更多的上下文来帮助-你想实现什么?您能否详细说明您的示例,使其显示性能问题?