C For inside For-如何在不花费时间创建线程的情况下执行inside For并行
我是OpenMP和 我面临这样的情况: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) } /
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=线程编号),但它的语句是非法的。我需要更多的上下文来帮助-你想实现什么?您能否详细说明您的示例,使其显示性能问题?