登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
9月20日,Gitee × 模力方舟来成都了!聚焦 AI 应用在开发范式、算力架构、交互设计、硬件选型等跨场景创新实践,点击立即报名~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
123
Star
0
Fork
14
src-openEuler
/
fftw
代码
Issues
0
Pull Requests
1
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
没启用SIMD优化,计算耗时比ubuntu和rocky慢250%。
已完成
#ICLCQ3
缺陷
kirbyzhou
创建于
2025-07-10 11:38
**【缺陷描述】:请补充详细的缺陷问题现象描述** 没启用SIMD优化,计算耗时比ubuntu和rocky慢250%。 **一、缺陷信息** **【缺陷所属的os版本】(如openEuler-22.03-LTS,参考命令"cat /etc/os-release"结果)** openEuler-24.03-LTS-SP1 **【缺陷所属软件及版本号】(如kernel-5.10.0-60.138.0.165,参考命令"rpm -q 包名"结果)** fftw-3.3.10-1.oe2403sp1 **【环境信息】** Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz 软件信息 - 跟缺陷所属软件相关的其它软件版本信息(如软件包构建失败由gcc引起,请填写gcc的版本号) **【问题复现步骤】:请描述具体的操作步骤** 随手写个fftw测速,发现比Rocky9和Ubuntu24明显慢   **【实际结果】**,请描述出问题的结果和影响 **【期望结果】**,请描述出期望的结果和影响 **【其他相关附件信息】** strings /usr/lib64/libfftw3*.so | fgrep -i avx 在OpenEuler下啥输出都没有。 在Rocky9和Ubuntu24下各有几百行输出。 通过perf工具确认几乎没使用向量化 ``` @openeuler2403_zhoutianling build]$ perf stat -e fp_arith_inst_retired.scalar_single,fp_arith_inst_retired.scalar_double,fp_arith_inst_retired.128b_packed_single,fp_arith_inst_retired.128b_packed_double,fp_arith_inst_retired.256b_packed_single,fp_arith_inst_retired.256b_packed_double,fp_arith_inst_retired.512b_packed_single,fp_arith_inst_retired.512b_packed_double ./kmbench calib -S 5m -j fft *arguments: calib -l 2 -j fft -a 4096:4096 -S 5242880:5242880 *actual_thr_number: 1 *ReqSize: 5242880 [ 0]: stat : 1.006 ms * 100 [25]: fft : 182.931 ms * 12 blockzero: 0% (0/101) datazero: 4b=62.4594% 8b=25.1200% 16b=25.1200% Performance counter stats for './kmbench calib -S 5m -j fft': 0 fp_arith_inst_retired.scalar_single:u (49.97%) 303,091,627 fp_arith_inst_retired.scalar_double:u (49.97%) 0 fp_arith_inst_retired.128b_packed_single:u (49.98%) 799 fp_arith_inst_retired.128b_packed_double:u (50.02%) 0 fp_arith_inst_retired.256b_packed_single:u (50.03%) 0 fp_arith_inst_retired.256b_packed_double:u (50.03%) 0 fp_arith_inst_retired.512b_packed_single:u (50.02%) 0 fp_arith_inst_retired.512b_packed_double:u (49.98%) 2.657821021 seconds time elapsed 2.437137000 seconds user 0.006960000 seconds sys ``` 测速代码片段 ``` #if FFTW_FOUND static std::map<int, fftw_plan> saved_fftw_plans_fft; static std::map<int, fftw_plan> saved_fftw_plans_fft_2d; static std::map<int, fftw_plan> saved_fftw_plans_fft_r2r; static std::map<int, fftwf_plan> saved_fftw_plans_fftf; static std::map<int, int> saved_fftw_n_fft; static std::map<int, int> saved_fftw_n_fft_2d; static std::map<int, int> saved_fftw_n_fft_r2r; static std::map<int, int> saved_fftw_n_fftf; static void prep_fftw_plans(const TestCaseDesc& testcase, const unsigned reqsize_samples[], unsigned reqsize_kind) { for (unsigned i = 0; i < reqsize_kind; ++i) { unsigned s = reqsize_samples[i]; if (saved_fftw_plans_fft.find(s) != saved_fftw_plans_fft.end()) continue; int n = s / sizeof(fftw_complex); int n2d = s / sizeof(fftw_complex); int nr = s / sizeof(double); int nf = s / sizeof(fftwf_complex); // adjust by calibration n = n/4; n2d = n2d; // adjust in case JOB_fft_2d: nr = nr/4; nf = nf/8; // save saved_fftw_n_fft[s] = n; saved_fftw_n_fft_2d[s] = n2d; saved_fftw_n_fft_r2r[s] = nr; saved_fftw_n_fftf[s] = nf; // prepare pointers fftw_complex* pin = NULL, *pout = NULL; posix_memalign(&(void*&)pin, PAGE_SIZE, s); posix_memalign(&(void*&)pout, PAGE_SIZE, s); double* pinr = (double*)pin; double* poutr = (double*)pout; fftwf_complex* pinf = (fftwf_complex*)pin; fftwf_complex* poutf = (fftwf_complex*)pout; // prepare plans { fftw_plan plan = fftw_plan_dft_1d(n, pin, pout, FFTW_FORWARD, FFTW_ESTIMATE); saved_fftw_plans_fft[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftw-1d plan (%d/%u):\n", n, s); fftw_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } { int n2 = std::min(256, n2d/12); int n1 = n2d/n2; fftw_plan plan = fftw_plan_dft_2d(n1, n2, pin, pout, FFTW_FORWARD, FFTW_ESTIMATE); saved_fftw_plans_fft_2d[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftw-2d plan (%d*%d/%u):\n", n1, n2, s); fftw_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } { fftw_plan plan = fftw_plan_r2r_1d(nr, pinr, poutr, FFTW_R2HC, FFTW_ESTIMATE); saved_fftw_plans_fft_r2r[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftw-r2r plan (%d/%u):\n", nr, s); fftw_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } { fftwf_plan plan = fftwf_plan_dft_1d(nf, pinf, poutf, FFTW_FORWARD, FFTW_ESTIMATE); saved_fftw_plans_fftf[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftwf-1d plan (%d/%u):\n", n, s); fftwf_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } free(pin); free(pout); } } #endif /* FFTW_FOUND */ #if FFTW_FOUND template<JOB_ITEM cpujob> static long fftw_test(const size_t req_size, const uint8_t* const data, uint8_t* tmpbuf, long, bool) { fftw_complex* pin = (fftw_complex*)data; double* pinr = (double*)data; fftwf_complex* pinf = (fftwf_complex*)data; fftw_complex* pout = (fftw_complex*)tmpbuf; double* poutr = (double*)tmpbuf; fftwf_complex* poutf = (fftwf_complex*)tmpbuf; #define DOEXECUTE_FFT(NAME, FUNC, IN, OUT) { \ if (saved_fftw_plans_##NAME.count(req_size) != 1) { \ fprintf(stderr, "Can not find plan for %zu\n", req_size); \ exit(1); \ } \ int s = req_size / sizeof((IN)[0]); \ int nn = saved_fftw_n_##NAME[req_size]; \ for (int i = 0; i+nn <= s; i += nn) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+i, (OUT)+i); \ if (s%nn >= nn/2) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+s-nn, (OUT)+s-nn); \ } switch(cpujob) { case JOB_fft: DOEXECUTE_FFT(fft, fftw_execute_dft, pin, pout); break; case JOB_fft_2d: DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); break; case JOB_fft_r2r: DOEXECUTE_FFT(fft_r2r, fftw_execute_r2r, pinr, poutr); break; case JOB_fftf: DOEXECUTE_FFT(fftf, fftwf_execute_dft, pinf, poutf); break; default: assert(false); } #undef DOEXECUTE_FFT return 0; } #endif /* FFTW_FOUND */ #if FFTW_FOUND template<JOB_ITEM cpujob> static long fftw_test(const size_t req_size, const uint8_t* const data, uint8_t* tmpbuf, long, bool) { fftw_complex* pin = (fftw_complex*)data; double* pinr = (double*)data; fftwf_complex* pinf = (fftwf_complex*)data; fftw_complex* pout = (fftw_complex*)tmpbuf; double* poutr = (double*)tmpbuf; fftwf_complex* poutf = (fftwf_complex*)tmpbuf; #define DOEXECUTE_FFT(NAME, FUNC, IN, OUT) { \ if (saved_fftw_plans_##NAME.count(req_size) != 1) { \ fprintf(stderr, "Can not find plan for %zu\n", req_size); \ exit(1); \ } \ int s = req_size / sizeof((IN)[0]); \ int nn = saved_fftw_n_##NAME[req_size]; \ for (int i = 0; i+nn <= s; i += nn) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+i, (OUT)+i); \ if (s%nn >= nn/2) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+s-nn, (OUT)+s-nn); \ } switch(cpujob) { case JOB_fft: DOEXECUTE_FFT(fft, fftw_execute_dft, pin, pout); break; case JOB_fft_2d: DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); break; case JOB_fft_r2r: DOEXECUTE_FFT(fft_r2r, fftw_execute_r2r, pinr, poutr); break; case JOB_fftf: DOEXECUTE_FFT(fftf, fftwf_execute_dft, pinf, poutf); break; default: assert(false); } #undef DOEXECUTE_FFT return 0; } #endif /* FFTW_FOUND */ ``` **【缺陷详情及分析指导参考链接】** 编译这个包的时候没开SIMD优化,请参考其他发行版的spec文件。 **二、缺陷分析结构反馈** 影响性分析说明: 缺陷严重等级:(Critical/High/Moderate/Low) 缺陷根因说明: 受影响版本排查(受影响/不受影响): openEuler-20.03-LTS-SP4 openEuler-22.03-LTS-SP3 openEuler-22.03-LTS-SP4 openEuler-24.03-LTS openEuler-24.03-LTS-SP1 修复是否涉及abi变化(是/否): openEuler-20.03-LTS-SP4 openEuler-22.03-LTS-SP3 openEuler-22.03-LTS-SP4 openEuler-24.03-LTS openEuler-24.03-LTS-SP1
**【缺陷描述】:请补充详细的缺陷问题现象描述** 没启用SIMD优化,计算耗时比ubuntu和rocky慢250%。 **一、缺陷信息** **【缺陷所属的os版本】(如openEuler-22.03-LTS,参考命令"cat /etc/os-release"结果)** openEuler-24.03-LTS-SP1 **【缺陷所属软件及版本号】(如kernel-5.10.0-60.138.0.165,参考命令"rpm -q 包名"结果)** fftw-3.3.10-1.oe2403sp1 **【环境信息】** Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz 软件信息 - 跟缺陷所属软件相关的其它软件版本信息(如软件包构建失败由gcc引起,请填写gcc的版本号) **【问题复现步骤】:请描述具体的操作步骤** 随手写个fftw测速,发现比Rocky9和Ubuntu24明显慢   **【实际结果】**,请描述出问题的结果和影响 **【期望结果】**,请描述出期望的结果和影响 **【其他相关附件信息】** strings /usr/lib64/libfftw3*.so | fgrep -i avx 在OpenEuler下啥输出都没有。 在Rocky9和Ubuntu24下各有几百行输出。 通过perf工具确认几乎没使用向量化 ``` @openeuler2403_zhoutianling build]$ perf stat -e fp_arith_inst_retired.scalar_single,fp_arith_inst_retired.scalar_double,fp_arith_inst_retired.128b_packed_single,fp_arith_inst_retired.128b_packed_double,fp_arith_inst_retired.256b_packed_single,fp_arith_inst_retired.256b_packed_double,fp_arith_inst_retired.512b_packed_single,fp_arith_inst_retired.512b_packed_double ./kmbench calib -S 5m -j fft *arguments: calib -l 2 -j fft -a 4096:4096 -S 5242880:5242880 *actual_thr_number: 1 *ReqSize: 5242880 [ 0]: stat : 1.006 ms * 100 [25]: fft : 182.931 ms * 12 blockzero: 0% (0/101) datazero: 4b=62.4594% 8b=25.1200% 16b=25.1200% Performance counter stats for './kmbench calib -S 5m -j fft': 0 fp_arith_inst_retired.scalar_single:u (49.97%) 303,091,627 fp_arith_inst_retired.scalar_double:u (49.97%) 0 fp_arith_inst_retired.128b_packed_single:u (49.98%) 799 fp_arith_inst_retired.128b_packed_double:u (50.02%) 0 fp_arith_inst_retired.256b_packed_single:u (50.03%) 0 fp_arith_inst_retired.256b_packed_double:u (50.03%) 0 fp_arith_inst_retired.512b_packed_single:u (50.02%) 0 fp_arith_inst_retired.512b_packed_double:u (49.98%) 2.657821021 seconds time elapsed 2.437137000 seconds user 0.006960000 seconds sys ``` 测速代码片段 ``` #if FFTW_FOUND static std::map<int, fftw_plan> saved_fftw_plans_fft; static std::map<int, fftw_plan> saved_fftw_plans_fft_2d; static std::map<int, fftw_plan> saved_fftw_plans_fft_r2r; static std::map<int, fftwf_plan> saved_fftw_plans_fftf; static std::map<int, int> saved_fftw_n_fft; static std::map<int, int> saved_fftw_n_fft_2d; static std::map<int, int> saved_fftw_n_fft_r2r; static std::map<int, int> saved_fftw_n_fftf; static void prep_fftw_plans(const TestCaseDesc& testcase, const unsigned reqsize_samples[], unsigned reqsize_kind) { for (unsigned i = 0; i < reqsize_kind; ++i) { unsigned s = reqsize_samples[i]; if (saved_fftw_plans_fft.find(s) != saved_fftw_plans_fft.end()) continue; int n = s / sizeof(fftw_complex); int n2d = s / sizeof(fftw_complex); int nr = s / sizeof(double); int nf = s / sizeof(fftwf_complex); // adjust by calibration n = n/4; n2d = n2d; // adjust in case JOB_fft_2d: nr = nr/4; nf = nf/8; // save saved_fftw_n_fft[s] = n; saved_fftw_n_fft_2d[s] = n2d; saved_fftw_n_fft_r2r[s] = nr; saved_fftw_n_fftf[s] = nf; // prepare pointers fftw_complex* pin = NULL, *pout = NULL; posix_memalign(&(void*&)pin, PAGE_SIZE, s); posix_memalign(&(void*&)pout, PAGE_SIZE, s); double* pinr = (double*)pin; double* poutr = (double*)pout; fftwf_complex* pinf = (fftwf_complex*)pin; fftwf_complex* poutf = (fftwf_complex*)pout; // prepare plans { fftw_plan plan = fftw_plan_dft_1d(n, pin, pout, FFTW_FORWARD, FFTW_ESTIMATE); saved_fftw_plans_fft[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftw-1d plan (%d/%u):\n", n, s); fftw_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } { int n2 = std::min(256, n2d/12); int n1 = n2d/n2; fftw_plan plan = fftw_plan_dft_2d(n1, n2, pin, pout, FFTW_FORWARD, FFTW_ESTIMATE); saved_fftw_plans_fft_2d[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftw-2d plan (%d*%d/%u):\n", n1, n2, s); fftw_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } { fftw_plan plan = fftw_plan_r2r_1d(nr, pinr, poutr, FFTW_R2HC, FFTW_ESTIMATE); saved_fftw_plans_fft_r2r[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftw-r2r plan (%d/%u):\n", nr, s); fftw_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } { fftwf_plan plan = fftwf_plan_dft_1d(nf, pinf, poutf, FFTW_FORWARD, FFTW_ESTIMATE); saved_fftw_plans_fftf[s] = plan; if (testcase.verbose >= 2) { fprintf(stderr, "fftwf-1d plan (%d/%u):\n", n, s); fftwf_fprint_plan(plan, stderr); fprintf(stderr, "\n"); } } free(pin); free(pout); } } #endif /* FFTW_FOUND */ #if FFTW_FOUND template<JOB_ITEM cpujob> static long fftw_test(const size_t req_size, const uint8_t* const data, uint8_t* tmpbuf, long, bool) { fftw_complex* pin = (fftw_complex*)data; double* pinr = (double*)data; fftwf_complex* pinf = (fftwf_complex*)data; fftw_complex* pout = (fftw_complex*)tmpbuf; double* poutr = (double*)tmpbuf; fftwf_complex* poutf = (fftwf_complex*)tmpbuf; #define DOEXECUTE_FFT(NAME, FUNC, IN, OUT) { \ if (saved_fftw_plans_##NAME.count(req_size) != 1) { \ fprintf(stderr, "Can not find plan for %zu\n", req_size); \ exit(1); \ } \ int s = req_size / sizeof((IN)[0]); \ int nn = saved_fftw_n_##NAME[req_size]; \ for (int i = 0; i+nn <= s; i += nn) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+i, (OUT)+i); \ if (s%nn >= nn/2) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+s-nn, (OUT)+s-nn); \ } switch(cpujob) { case JOB_fft: DOEXECUTE_FFT(fft, fftw_execute_dft, pin, pout); break; case JOB_fft_2d: DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); break; case JOB_fft_r2r: DOEXECUTE_FFT(fft_r2r, fftw_execute_r2r, pinr, poutr); break; case JOB_fftf: DOEXECUTE_FFT(fftf, fftwf_execute_dft, pinf, poutf); break; default: assert(false); } #undef DOEXECUTE_FFT return 0; } #endif /* FFTW_FOUND */ #if FFTW_FOUND template<JOB_ITEM cpujob> static long fftw_test(const size_t req_size, const uint8_t* const data, uint8_t* tmpbuf, long, bool) { fftw_complex* pin = (fftw_complex*)data; double* pinr = (double*)data; fftwf_complex* pinf = (fftwf_complex*)data; fftw_complex* pout = (fftw_complex*)tmpbuf; double* poutr = (double*)tmpbuf; fftwf_complex* poutf = (fftwf_complex*)tmpbuf; #define DOEXECUTE_FFT(NAME, FUNC, IN, OUT) { \ if (saved_fftw_plans_##NAME.count(req_size) != 1) { \ fprintf(stderr, "Can not find plan for %zu\n", req_size); \ exit(1); \ } \ int s = req_size / sizeof((IN)[0]); \ int nn = saved_fftw_n_##NAME[req_size]; \ for (int i = 0; i+nn <= s; i += nn) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+i, (OUT)+i); \ if (s%nn >= nn/2) \ FUNC(saved_fftw_plans_##NAME[req_size], (IN)+s-nn, (OUT)+s-nn); \ } switch(cpujob) { case JOB_fft: DOEXECUTE_FFT(fft, fftw_execute_dft, pin, pout); break; case JOB_fft_2d: DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); DOEXECUTE_FFT(fft_2d, fftw_execute_dft, pin, pout); break; case JOB_fft_r2r: DOEXECUTE_FFT(fft_r2r, fftw_execute_r2r, pinr, poutr); break; case JOB_fftf: DOEXECUTE_FFT(fftf, fftwf_execute_dft, pinf, poutf); break; default: assert(false); } #undef DOEXECUTE_FFT return 0; } #endif /* FFTW_FOUND */ ``` **【缺陷详情及分析指导参考链接】** 编译这个包的时候没开SIMD优化,请参考其他发行版的spec文件。 **二、缺陷分析结构反馈** 影响性分析说明: 缺陷严重等级:(Critical/High/Moderate/Low) 缺陷根因说明: 受影响版本排查(受影响/不受影响): openEuler-20.03-LTS-SP4 openEuler-22.03-LTS-SP3 openEuler-22.03-LTS-SP4 openEuler-24.03-LTS openEuler-24.03-LTS-SP1 修复是否涉及abi变化(是/否): openEuler-20.03-LTS-SP4 openEuler-22.03-LTS-SP3 openEuler-22.03-LTS-SP4 openEuler-24.03-LTS openEuler-24.03-LTS-SP1
评论 (
3
)
登录
后才可以发表评论
状态
已完成
待办的
已挂起
修复中
已确认
已完成
已验收
已取消
负责人
未设置
mdche
gitee-cmd
负责人
协作者
+负责人
+协作者
标签
sig/Runtime
未设置
项目
未立项任务
未立项任务
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (28)
标签 (29)
master
openEuler-25.09
openEuler-24.03-LTS-Next
openEuler-24.03-LTS-SP1
openEuler-24.03-LTS
openEuler-24.03-LTS-SP2
openEuler-22.03-LTS-SP3
openEuler-22.03-LTS-SP4
openEuler-20.03-LTS-SP4
openEuler-23.03
openEuler-23.09
openEuler-24.09
openEuler-25.03
openEuler-22.03-LTS-Next
openEuler-22.03-LTS-SP2
openEuler-22.03-LTS-SP1
openEuler-22.09
openEuler-22.03-LTS
openEuler-20.09
openEuler-21.03
openEuler-21.09
openEuler-20.03-LTS
openEuler-20.03-LTS-Next
openEuler-20.03-LTS-SP1
openEuler-20.03-LTS-SP2
openEuler-20.03-LTS-SP3
openEuler1.0
openEuler1.0-base
openEuler-20.03-LTS-SP4-update-20250718
openEuler-22.03-LTS-SP3-update-20250718
openEuler-22.03-LTS-SP4-update-20250718
openEuler-24.03-LTS-update-20250718
openEuler-24.03-LTS-SP1-update-20250718
openEuler-24.03-LTS-SP2-update-20250718
openEuler-24.03-LTS-SP2-release
openEuler-25.03-release
openEuler-24.03-LTS-SP1-release
openEuler-22.03-LTS-SP4-release
openEuler-24.09-release
openEuler-24.03-LTS-release
openEuler-22.03-LTS-SP3-release
openEuler-23.09-rc5
openEuler-22.03-LTS-SP1-release
openEuler-22.09-release
openEuler-22.09-rc5
openEuler-22.09-20220829
openEuler-22.03-LTS-20220331
openEuler-22.03-LTS-round5
openEuler-22.03-LTS-round3
openEuler-22.03-LTS-round2
openEuler-22.03-LTS-round1
openEuler-20.03-LTS-SP3-release
openEuler-20.03-LTS-SP2-20210624
openEuler-21.03-20210330
openEuler-20.03-LTS-20200606
openEuler-20.09-20200929
openEuler-20.03-LTS-tag
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
1
https://gitee.com/src-openeuler/fftw.git
git@gitee.com:src-openeuler/fftw.git
src-openeuler
fftw
fftw
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册