Re: GCC Optimization Levels - Seeking Insights

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 22/12/2023 11:44, Aran Nokan via Gcc-help wrote:
Hi,

Thank you. I noticed that it is not working with the following error:

No rule to make target 'test.0',


So I changed it to this:

$(PROGS): test.% : $(SRC) $(DEPS)
         $(CC) -o $@ $(CFLAGS) $(LDLAGS) -O$* $(SRC)


But now another problem:

make: *** No rule to make target 'levmarg.c', needed by 'test.0'.  Stop.


Do you have any idea how to fix it?

Yes, that one's easy - fix my spelling mistake! I think your file is called "levmarq.c", while I had written "levmarg.c" (with "g" instead of "q").

As I said, I had not tested the makefile at all - it was just a suggestion that might help you, and it avoids the problem Jonathan pointed out where you were not re-compiling the .o files with the right optimisation flags. If this is just for one-off experimentation, you could just use your original makefile but with a "make clean" before each "make main_opt?" run.

David




Sincerely,
Aran

On Fri, Dec 22, 2023 at 10:26 AM David Brown via Gcc-help <
gcc-help@xxxxxxxxxxx> wrote:

On 21/12/2023 20:57, Jonathan Wakely via Gcc-help wrote:
On Thu, 21 Dec 2023, 19:33 Aran Nokan via Gcc-help, <
gcc-help@xxxxxxxxxxx>
wrote:

Hello GCC Community,

I recently conducted an experiment where I tested the impact of
different
GCC optimization levels on the performance of a code
<https://github.com/leechwort/levenberg-maquardt-example>. I observed
that
higher optimization levels didn't necessarily result in faster code
execution.

Is it correct or I have made a mistake? Do we have any other parameters
for
optimization?


There is no guarantee that optimization make code faster, except that -O0
will invariably be slower.


However, I suspect the problem is that your makefile only builds the .o
objects once, for the first target that needs them. That means they will
be
optimized (or not optimized) according to the CFLAGS set when building
that
first target.

Unless you do 'make clean' before building each target, you weren't
actually testing what you intend to test.



For this test, since there are not many source files, I'd put them all
on the same gcc line :


default: all
.PHONY: all


OPTS = 0 1 2 3 g fast

PROGS = $(foreach opt, $(OPTS), test.$(opt))
all: $(PROGS)

CC = gcc
CFLAGS_COMMON = -I.
LDLAGS = -lm
DEPS = levmarq.h makefile
SRC = main.c levmarg.c

test.% : $(SRC) $(DEPS)
         gcc -o $@ $(CFLAGS) $(LDLAGS) -O$* $(SRC)

clean:
         rm -f $(PROGS)



(I haven't tried the makefile at all, but it might be a starting point
for the OP.)



My make file was as follows:


CC=gcc
CFLAGS_COMMON=-I.
LDLAGS=-lm
DEPS = levmarq.h
OBJ = main.o levmarq.o

%.o: %.c $(DEPS)
          $(CC) -c -o $@ $< $(CFLAGS) $(LDLAGS)

main: $(OBJ)
          gcc -o $@ $^ $(CFLAGS) $(LDLAGS)

# No optimization
main_no_opt: CFLAGS += -O0
main_no_opt: $(OBJ)
          gcc -o $@ $^ $(CFLAGS) $(LDLAGS)

# Basic optimization
main_opt1: CFLAGS += -O1
main_opt1: $(OBJ)
          gcc -o $@ $^ $(CFLAGS) $(LDLAGS)

# Moderate optimization
main_opt2: CFLAGS += -O2
main_opt2: $(OBJ)
          gcc -o $@ $^ $(CFLAGS) $(LDLAGS)

# High optimization
main_opt3: CFLAGS += -O3
main_opt3: $(OBJ)
          gcc -o $@ $^ $(CFLAGS) $(LDLAGS)

# Clean rule
clean:
          rm -f *.o main main_no_opt main_opt2 main_opt3


Best regards,
Aran











[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux