sse2 指令集未启用
sse2 instruction set not enabled
CC=g++
CFLAGS=-O3 -c -Wall
DFLAGS=-g -Wall
LDFLAGS= -lz -lm -lpthread
KSWSOURCE=ksw.c
ALGNSOURCES=main.cpp aligner.cpp graph.cpp readfl.cpp hash.cpp form.cpp btree.cpp conLSH.cpp
INDSOURCES=whash.cpp genhash.cpp formh.cpp conLSH.cpp
INDOBJECTS=$(INDSOURCES:.cpp=.o) $(KSWSOURCE:.c=.o)
ALGNOBJECTS=$(ALGNSOURCES:.cpp=.o) $(KSWSOURCE:.c=.o)
INDEXER=conLSH-indexer
ALIGNER=conLSH-aligner
all: $(INDSOURCES) $(ALGNSOURCES) $(KSWSOURCE) $(ALIGNER) $(INDEXER)
$(ALIGNER): $(ALGNOBJECTS)
$(CC) $(ALGNOBJECTS) -o $@ $(LDFLAGS)
$(INDEXER): $(INDOBJECTS)
$(CC) $(INDOBJECTS) readfl.o -o $@ $(LDFLAGS)
debug:
$(CC) $(DFLAGS) $(ALGNSOURCES) $(KSWSOURCE) $(LDFLAGS)
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
.c.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm -rf *.o $(ALIGNER) $(INDEXER) a.out
我有上面的 makefile,但出现错误
/usr/lib/gcc/i686-linux-gnu/4.8/include/emmintrin.h:31:3: error: #error "SSE2 instruction set not enabled"
# error "SSE2 instruction set not enabled"
根据我的理解和谷歌搜索,这是并行计算的标志。
我尝试从其他有同样问题的帖子中包括:
CXXFLAGS=-03 -c Wall -mfpmath=sse
或:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3")
但没有任何成功。你能帮忙吗?
我不确定是否需要 CXX 标志,因为 ksw 中显示了很多(可能)级联错误,例如,
ksw.c:49:2: error: ‘__m128i’ does not name a type
__m128i *qp, *H0, *H1, *E, *Hmax;
-msse2
是特定选项,因此如果您将构建脚本设置为实际执行此操作,则将其传递给 GCC 即可。 https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#x86-Options
或者更好的是,使用 -march=native
来启用你的 CPU 所拥有的一切,如果你是为本地使用而构建的,而不是为了分发可能必须在旧的但 -不古老 CPU。 (当然,如果你关心性能,为 32 位模式构建是很奇怪的。SSE2 是 x86-64 的基线。除非你的 CPU 太旧而不能支持 SSE2,例如 Pentium III。或者对于例如,有没有 SSE 的嵌入式 x86 CPUs,比如 AMD Geode。在这种情况下,使用 -msse2
构建(成功)的二进制文件可能会因非法指令而崩溃 CPU.)
-mfpmath=sse
只是告诉 GCC 在 SSE 可用的情况下将 SSE 用于标量 FP 数学;与告诉 GCC 假定目标 CPU 支持 SSE2 无关。使用它 也可以 提高性能,但对编译代码没有影响。
是的,像 __m128i
这样的 SSE1/2 内部类型只有在启用 SSE 时才会被定义,所以 error: ‘__m128i’ does not name a type
是 -msse
未启用的明确标志
如果使用 autoconf 之类的,也许使用这个:
./configure CPPFLAGS="-O3 -march=native -fno-math-errno"
如果您有 .c 文件和 .cpp,请设置 CFLAGS 和 CPPFLAGS。更多选项如 -flto
可以帮助优化(在 link 时间跨文件内联),如果你将它们添加到你的 LD 选项中。以及任何其他优化选项,如 -ffast-math
如果你想使用它。或者至少 -fno-trapping-math
可以帮助一些,并且 GCC 已经进行了优化,这违反了 trapping-math 应该提供的语义。请参阅 回复:-fno-trapping-math -fno-math-errno
基本上在任何地方都可以安全使用,即使在依赖严格 FP 的代码(如 Kahan 求和)中也是如此。
这对我也有用:
./configure CPPFLAGS="-march=native"
CC=g++
CFLAGS=-O3 -c -Wall
DFLAGS=-g -Wall
LDFLAGS= -lz -lm -lpthread
KSWSOURCE=ksw.c
ALGNSOURCES=main.cpp aligner.cpp graph.cpp readfl.cpp hash.cpp form.cpp btree.cpp conLSH.cpp
INDSOURCES=whash.cpp genhash.cpp formh.cpp conLSH.cpp
INDOBJECTS=$(INDSOURCES:.cpp=.o) $(KSWSOURCE:.c=.o)
ALGNOBJECTS=$(ALGNSOURCES:.cpp=.o) $(KSWSOURCE:.c=.o)
INDEXER=conLSH-indexer
ALIGNER=conLSH-aligner
all: $(INDSOURCES) $(ALGNSOURCES) $(KSWSOURCE) $(ALIGNER) $(INDEXER)
$(ALIGNER): $(ALGNOBJECTS)
$(CC) $(ALGNOBJECTS) -o $@ $(LDFLAGS)
$(INDEXER): $(INDOBJECTS)
$(CC) $(INDOBJECTS) readfl.o -o $@ $(LDFLAGS)
debug:
$(CC) $(DFLAGS) $(ALGNSOURCES) $(KSWSOURCE) $(LDFLAGS)
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
.c.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm -rf *.o $(ALIGNER) $(INDEXER) a.out
我有上面的 makefile,但出现错误
/usr/lib/gcc/i686-linux-gnu/4.8/include/emmintrin.h:31:3: error: #error "SSE2 instruction set not enabled"
# error "SSE2 instruction set not enabled"
根据我的理解和谷歌搜索,这是并行计算的标志。
我尝试从其他有同样问题的帖子中包括:
CXXFLAGS=-03 -c Wall -mfpmath=sse
或:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3")
但没有任何成功。你能帮忙吗?
我不确定是否需要 CXX 标志,因为 ksw 中显示了很多(可能)级联错误,例如,
ksw.c:49:2: error: ‘__m128i’ does not name a type
__m128i *qp, *H0, *H1, *E, *Hmax;
-msse2
是特定选项,因此如果您将构建脚本设置为实际执行此操作,则将其传递给 GCC 即可。 https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#x86-Options
或者更好的是,使用 -march=native
来启用你的 CPU 所拥有的一切,如果你是为本地使用而构建的,而不是为了分发可能必须在旧的但 -不古老 CPU。 (当然,如果你关心性能,为 32 位模式构建是很奇怪的。SSE2 是 x86-64 的基线。除非你的 CPU 太旧而不能支持 SSE2,例如 Pentium III。或者对于例如,有没有 SSE 的嵌入式 x86 CPUs,比如 AMD Geode。在这种情况下,使用 -msse2
构建(成功)的二进制文件可能会因非法指令而崩溃 CPU.)
-mfpmath=sse
只是告诉 GCC 在 SSE 可用的情况下将 SSE 用于标量 FP 数学;与告诉 GCC 假定目标 CPU 支持 SSE2 无关。使用它 也可以 提高性能,但对编译代码没有影响。
是的,像 __m128i
这样的 SSE1/2 内部类型只有在启用 SSE 时才会被定义,所以 error: ‘__m128i’ does not name a type
是 -msse
未启用的明确标志
如果使用 autoconf 之类的,也许使用这个:
./configure CPPFLAGS="-O3 -march=native -fno-math-errno"
如果您有 .c 文件和 .cpp,请设置 CFLAGS 和 CPPFLAGS。更多选项如 -flto
可以帮助优化(在 link 时间跨文件内联),如果你将它们添加到你的 LD 选项中。以及任何其他优化选项,如 -ffast-math
如果你想使用它。或者至少 -fno-trapping-math
可以帮助一些,并且 GCC 已经进行了优化,这违反了 trapping-math 应该提供的语义。请参阅 -fno-trapping-math -fno-math-errno
基本上在任何地方都可以安全使用,即使在依赖严格 FP 的代码(如 Kahan 求和)中也是如此。
这对我也有用:
./configure CPPFLAGS="-march=native"