【问题标题】:Intel OneAPI FFT Segmentation Fault and Bus Error [duplicate]英特尔 OneAPI FFT 分段错误和总线错误 [重复]
【发布时间】:2021-04-21 07:04:14
【问题描述】:

我有一些大小为 N 的复数值数据,并想使用 Intel OneAPI 计算这些数据的 FFT。这是我的代码:

# Connectivity
#include <bits/stdc++.h>
#include "mkl_dfti.h"
#include <complex.h>

using namespace std;
float pi = 2*acos(0.0);

int main(){
        long long int N; cin >> N
        float _Complex c2c_data[N];
        DFTI_DESCRIPTOR_HANDLE my_desc1_handle = NULL;
        DFTI_DESCRIPTOR_HANDLE my_desc2_handle = NULL;
        MKL_LONG status;
// data is inserted here
        status = DftiCreateDescriptor(&my_desc1_handle, DFTI_SINGLE, DFTI_COMPLEX, 1, N);
        status = DftiCommitDescriptor(my_desc1_handle);
        status = DftiComputeForward(my_desc1_handle, c2c_data);
        status = DftiFreeDescriptor(&my_desc1_handle);
        cout << round(cabs(c2c_data[s]) / N) << "\n";
        return 0;
}

这适用于较小的 N 情况,但对于较大的情况(大约 2^21),我会遇到分段错误,对于更大的情况,我会遇到总线错误。我已经检查过这发生在DftiComputeForward 函数中。数据的长度在DftiCreateDescriptor 中指定,在这种情况下确实是 N,所以我不确定为什么会出现此错误。

这里是我如何编译我的代码:

dpcpp test.cpp -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -ldl -lpthread -o test

如果有人可以提供帮助,那就太好了。谢谢!

【问题讨论】:

  • 您可能正在耗尽您的堆栈空间。在 C++ 上考虑使用std::vector。
  • 我不认为是这种情况,因为它只在 DftiComputeForward 函数期间崩溃,即使在我放入数据后也很好。我只使用了一个数组,因为英特尔提供的示例就是这样做的用一个数组。不过我会试试的,谢谢!
  • float _Complex c2c_data[N]; 是一个 VLA(这是一个非标准扩展),所以无论如何使用 vector 来“忘记”它是件好事。
  • DftiComputeForward 文档声明它仅适用于数组,因此在这种情况下我不能使用向量。我已经尝试将其更改为矢量,但无法按预期编译。
  • 好的,我试过了,现在可以了。我仍在运行更大的测试用例。我可以对使用的堆栈空间的差异有所了解吗?我没有使用相同数量的空间吗?

标签: c++ intel intel-oneapi


【解决方案1】:

您可能正在耗尽堆栈内存空间。

请考虑改用矢量。

【讨论】:

  • 我没有检查过大的测试用例,因为运行时间太长,但它现在适用于以前失败的较大的测试用例!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多