SSE4-Strstr 项目使用教程
1. 项目的目录结构及介绍
SSE4-Strstr 项目的目录结构如下:
sse4-strstr/
├── original/
│ └── sse4_strstr.c
├── src/
│ ├── aarch64-strstr-v2.cpp
│ ├── avx2-naive-strstr.cpp
│ ├── avx2-naive-strstr64.cpp
│ ├── avx2-naive-unrolled-strstr.cpp
│ ├── avx2-strstr-v2-clang-specific.cpp
│ ├── avx2-strstr-v2.cpp
│ ├── avx2-strstr.cpp
│ ├── avx512bw-strstr-v2.cpp
│ └── sse4_strstr.cpp
├── utils/
├── .gitignore
├── LICENSE
├── Makefile
└── README.rst
目录介绍
original/
: 包含原始的 SSE4 字符串搜索实现文件sse4_strstr.c
。src/
: 包含多种优化和不同架构的实现文件,如 AVX2、AVX512 和 ARM Neon 等。utils/
: 包含项目辅助工具文件。.gitignore
: Git 忽略文件配置。LICENSE
: 项目许可证文件。Makefile
: 项目编译配置文件。README.rst
: 项目说明文档。
2. 项目的启动文件介绍
项目的启动文件主要是 src/sse4_strstr.cpp
,该文件包含了 SSE4 字符串搜索的核心实现。以下是该文件的主要内容:
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char* sse4_strstr_max36(char* s1, int n1, char* s2, int n2);
char* sse4_strstr(char* s1, int n1, char* s2, int n2) {
switch (n1) {
case 0: return NULL;
case 1: return strchr(s2, s1[1]);
case 2: return strstr(s2, s1);
case 3: return sse4_strstr_len3(s1, n1, s2, n2);
case 4: return sse4_strstr_len4(s1, n1, s2, n2);
case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20:
return sse4_strstr_max20(s1, n1, s2, n2);
case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36:
return sse4_strstr_max36(s1, n1, s2, n2);
default:
return sse4_strstr_any(s1, n1, s2, n2);
}
}
char* sse4_strstr_any(char* s1, int n1, char* s2, int n2) {
// n1 > 4, n2 > 4
char* result = NULL;
// 具体实现代码
return result;
}
3. 项目的配置文件介绍
项目的配置文件主要是 Makefile
,该文件用于配置项目的编译选项和依赖关系。以下是 Makefile
的主要内容:
# 编译器
CC = gcc
CXX = g++
# 编译选项
CFLAGS = -O3 -Wall -Wextra -march=native
CXXFLAGS = -O3 -Wall -Wextra -march=native
# 目标文件
TARGETS = sse4_strstr
# 源文件
SRCS = src/sse4_strstr.cpp
# 头文件路径
INCLUDES = -Iinclude
# 默认目标
all: $(TARGETS)
# 编译规则
$(TARGETS): $(SRCS)
$(CXX) $(CXXFLAGS) $(INCLUDES) -o $@ $<
# 清理规则
clean:
rm -f $(TARGETS)
通过 Makefile
,可以方便地进行项目的编译和清理工作。