使用Intel OpenMP查找最佳线程数:只有1个线程比许多线程有更好的结果

问题描述 投票:0回答:1

在我的代码中使用以下类型的循环的倍数:

#pragma omp parallel for schedule(dynamic, num_threads)
for(int i=0; i<F_matrix_A.size(); i++){
    for(int j=0; j<F_matrix_A.size(); j++){
        F_previous_T[i][j] = F_previous[j][i];
    }
}

#pragma omp parallel for schedule(dynamic, num_threads)
for(int i=0; i<F_matrix_A.size(); i++){
    for(int k=0; k<F_matrix_A.size(); k++){
        for(int j=0; j<=i; j++){
            if(F_previous_T[i][k] != 0 && F_previous[k][j] !=0){
                Fisher_new[i][j] += F_previous_T[i][k]*F_previous[k][j];
            }
        }
    }
}

当我在参数[#define num_threads 1]之前设置时,我会获得最好的性能>

我正在使用64核的工作站(当我执行/proc/cpuinfo时,我看到128个处理器)。我认为无法从如此众多的流程中受益是很可惜的。

是由于我使用的特定编译指示:

#pragma omp parallel for schedule(dynamic, num_threads)

??

还有其他选择来降低运行时间吗?我在不同的论坛上看到,使用大量流程可能会导致大量开销。

我的循环大小通常为1700x1700。

[如果有人有一个主意,可以告诉它。

UPDATE 1:

我的代码有2个版本,一个使用GNU g++,另一个使用Intel icpc

1)我在Makefile之后使用“通用”:

ifneq "$(MAKECMDGOALS)" "clean"
include $(MAKECMDGOALS).make
endif

OBJECTS = $(SOURCES:.cpp=.o)

$(MAKECMDGOALS): $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $< -o $@

clean:
    rm -f *.o

1)对于GNU g++,我使用gnu.make文件进行编译:

CXX = g++ -std=c++11 -O3 -fopenmp
CXXFLAGS = -Wall -c
LDFLAGS = -march=native
LDFLAGS =
SOURCES = main.cpp TSAF_gnu.cpp
EXECUTABLE = main_gnu.exe

2)对于Intel icpc,我使用intel.make文件进行编译:

CXX = icpc -std=c++11 -O3 -xHost -qopenmp
CXXFLAGS = -Wall -c -I${MKLROOT}/include
LDFLAGS  = -mkl=parallel
LDFLAGS += -L${MKLROOT}/lib/intel64_lin -Wl,-rpath,${MKLROOT}/lib/intel64_lin -lmkl_intel_lp64 -lmkl_intel_thread \
          -lmkl_core -liomp5 -lpthread
SOURCES = main.cpp TSAF_intel.cpp
EXECUTABLE = main_intel.exe

标准运行大约需要3分钟。

在我的代码中使用以下类型的循环的倍数:#pragma omp并行执行schedule(dynamic,num_threads)for(int i = 0; i

c++ multithreading optimization openmp intel
1个回答
0
投票

[C0行]可能导致可伸缩性问题

© www.soinside.com 2019 - 2024. All rights reserved.