0

我正在尝试 2 配置一个 cpp 代码。我用 -pg 标志编译,在我分析它以获得输出后,我得到了一些非常奇怪的函数名称。这是我正在使用的make文件:

# Makefile for parallel simulated annealer

PREFIX=${PARSECDIR}/pkgs/kernels/canneal/inst/${PARSECPLAT}

TARGET=canneal
LIBS:=$(LIBS) -lm

CXXFLAGS+=-pg

ifdef version
  ifeq "$(version)" "pthreads"
    CXXFLAGS+=-DENABLE_THREADS -pthread
  endif
endif

all:
    $(CXX) $(CXXFLAGS) annealer_thread.cpp -c -o annealer_thread.o
    $(CXX) $(CXXFLAGS) rng.cpp -c -o rng.o
    $(CXX) $(CXXFLAGS) netlist.cpp -c -o netlist.o
    $(CXX) $(CXXFLAGS) main.cpp -c -o main.o
    $(CXX) $(CXXFLAGS) netlist_elem.cpp -c -o netlist_elem.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) *.o $(LIBS) -o $(TARGET)

clean:
    rm -f *.o $(TARGET)

install:
    mkdir -p $(PREFIX)/bin
    cp -f $(TARGET) $(PREFIX)/bin/$(TARGET)

这是 gprof 输出的示例:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 11.21      0.73     0.73  2800002     0.00     0.00  std::_Rb_tree<std::string, std::pair<std::string const, netlist_elem*>, std::_Select1st<std::pair<std::string const, netlist_elem*> >, std::less<std::string>, std::allocator<std::pair<std::string const, netlist_elem*> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::string const, netlist_elem*> >*, std::_Rb_tree_node<std::pair<std::string const, netlist_elem*> >*, std::string const&)
 10.45      1.41     0.68  5856992     0.00     0.00  atomic_load_acq_int(unsigned int volatile*)
  8.76      1.98     0.57   400001     0.00     0.00  netlist_elem::routing_cost_given_loc(location_t)

这些是文件中的真实函数名称:

void annealer_thread::Run()

我忘记了任何标志吗?为什么分析还显示函数的参数?是因为它们是类吗?是因为它是cpp吗?我熟悉 gprof 和 c 但这是我第一次遇到 cpp

欢迎任何帮助:)欢呼=)

4

1 回答 1

1

在 C++ 中,函数名称包括它们所属的类、它们的返回类型以及它们的所有参数类型。这是通过“修改”名称来完成的。这样就可以使用不同的参数类型重载函数。gprof意识到这一点并且可以解开它们。

您在平面配置文件中看到的是 PC 经常被某些类库例程捕获。仅当它为您提供了代码中最终在这些例程中的调用路径的线索时,这才有用。调用图(仪器)在那里有一些帮助。

当然,它对您不想做的任何 I/O 都是视而不见的。该程序可能会花费 99% 的时间在库中进行深度 I/O,您不知道它正在发生,. 也不知道gprof

看看缩放

于 2011-01-25T16:24:24.227 回答