3. mcFFT API参考
本章通过描述其输入/输出参数、数据类型和错误代码来指定mcFFT库函数的行为。mcFFT库在第一次调用API函数时初始化,并在销毁所有用户创建的 FFT 计划时自动关闭。
3.1. 返回值mcfftResult
除了 MCFFT_SUCCESS 之外,所有mcFFT库返回值都表明当前API调用失败,用户应该重新配置以纠正问题。可能的返回值定义如下:
typedef enum mcfftResult_t {
MCFFT_SUCCESS = 0, // mcFFT操作成功
MCFFT_INVALID_PLAN = 1, // mcFFT传递了一个无效的计划句柄
MCFFT_ALLOC_FAILED = 2, // mcFFT分配GPU或CPU内存失败
MCFFT_INVALID_TYPE = 3, // 不再使用
MCFFT_INVALID_VALUE = 4, // 用户指定了无效的指针或参数
MCFFT_INTERNAL_ERROR = 5, // 驱动程序或内部mcFFT库错误
MCFFT_EXEC_FAILED = 6, // 在GPU上执行FFT失败
MCFFT_SETUP_FAILED = 7, // mcFFT库初始化失败
MCFFT_INVALID_SIZE = 8, // 用户指定了无效的变换大小
MCFFT_UNALIGNED_DATA = 9, // 不再使用
MCFFT_INCOMPLETE_PARAMETER_LIST = 10, // 调用中缺少参数
MCFFT_INVALID_DEVICE = 11, // 计划执行与计划创建在不同的GPU上
MCFFT_PARSE_ERROR = 12, // 内部计划数据库错误
MCFFT_NO_WORKSPACE = 13 // 在计划执行之前没有提供工作空间
MCFFT_NOT_IMPLEMENTED = 14, // 函数未实现给定参数的功能
MCFFT_LICENSE_ERROR = 15, // 用于以前的版本
MCFFT_NOT_SUPPORTED = 16 // 不支持给定参数的操作
} mcfftResult;
鼓励用户检查mcFFT函数的返回值以查找错误。
3.2. mcFFT基本计划
3.2.1. Function mcfftPlan1d()
mcfftResult
mcfftPlan1d(mcfftHandle *plan, int nx, mcfftType type, int batch);
为指定的信号大小和数据类型创建一个一维FFT计划配置。 batch 输入参数告诉mcFFT要配置多少个一维变换。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
指向一个 |
|
变换大小(例如,256点FFT的大小为256) |
|
转换数据类型(例如, |
|
大小为 |
输出
|
包含一个mcFFT一维计划句柄值 |
返回值
|
mcFFT成功创建FFT计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.2.2. Function mcfftPlan2d()
mcfftResult
mcfftPlan2d(mcfftHandle *plan, int nx, int ny, mcfftType type);
此调用根据指定的信号大小和数据类型创建二维FFT计划配置。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
指向一个 |
|
在x维的变换大小。这是变换中变化最慢的维度(跨距存储)。 |
|
在y维的变换大小。这是变换中变化最快的维度(连续存储)。 |
|
转换数据类型(例如, |
输出
|
包含一个mcFFT二维计划句柄值 |
返回值
|
mcFFT成功创建FFT计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.2.3. Function mcfftPlan3d()
mcfftResult
mcfftPlan3d(mcfftHandle *plan, int nx, int ny, int nz, mcfftType type);
根据指定的信号大小和数据类型创建三维FFT计划配置。除了第三个大小参数 nz 不同以外,这个函数与 mcfftPlan2d() 相同。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
指向一个 |
|
在x维的变换大小。这是变换中变化最慢的维度(跨距存储)。 |
|
在y维的变换大小。 |
|
在z维的变换大小。这是变换中变化最快的维度(连续存储)。 |
|
转换数据类型(例如, |
输出
|
包含一个mcFFT三维计划句柄值 |
返回值
|
mcFFT成功创建FFT计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.2.4. Function mcfftPlanMany()
mcfftResult
mcfftPlanMany(mcfftHandle *plan, int rank, int *n, int *inembed,
int istride, int idist, int *onembed, int ostride,
int odist, mcfftType type, int batch);
创建维度 rank 的一个FFT计划配置,其大小由数组 n 指定。 输入参数 batch 告诉mcFFT需要配置多少个变换。通过这个函数,可以创建一维、二维或三维的批处理计划。
mcfftPlanMany() API通过高级数据布局参数支持更复杂的输入和输出数据布局: inembed , istride , idist , onembed , ostride ,和 odist 。
如果 inembed 和 onembed 被设置为 NULL ,其他所有步幅信息将被忽略,并使用默认步幅。默认情况下假定连续的数据数组。
所有数组都假定在CPU内存中。
请注意,当 inembed 和 onembed 为 NULL 时, mcfftPlanMany 函数的行为与FFTW库 fftw_plan_many_dft 中对应的函数不同。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
指向一个 |
|
变换的维度(1、2或3)。 |
|
大小为 |
|
大小为 |
|
表示两个连续输入元素在最低有效维度(即最内层)之间的距 离。 |
|
表示一批输入数据中两个连续信号的第一个元素之间的距离 |
|
大小为 |
|
表示输出数组中两个连续输出的元素在最低有效维度(即最内 层)之间的距离。 |
|
表示批处理变换输入数据中两个连续信号的第一个元素之间的 距离。 |
|
转换数据类型(例如, |
|
此变换的批处理大小。 |
输出
|
包含一个mcFFT计划句柄。 |
返回值
|
mcFFT成功创建FFT计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
至少存在一个大小不受支持的无效参数。 |
3.3. mcFFT扩展计划
该 API 将句柄创建与计划生成分离开来。这使得在计划实际生成之前更改计划的设置成为可能,从而可能会改变计划生成阶段的结果。
3.3.1. Function mcfftCreate()
mcfftResult
mcfftCreate(mcfftHandle *plan);
仅创建不透明句柄,并在主机上分配小型数据结构。 由 mcfftMakePlan*() 调用来实际执行计划。
输入
|
指向 |
输出
|
包含一个mcFFT计划句柄值。 |
返回值
|
mcFFT成功创建FFT计划。 |
|
为计划分配资源失败。 |
|
向API传递了一个或多个无效参数 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
3.3.2. Function mcfftMakePlan1d()
mcfftResult
mcfftMakePlan1d(mcfftHandle plan, int nx, mcfftType type, int batch,
size_t *workSize);
在调用 mcfftCreate() 之后,为指定的信号大小和数据类型创建一个一维FFT计划配置。 batch 输入参数告诉mcFFT要配置多少个一维变换。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
由 |
|
变换大小(例如,256点FFT的大小为256)。 |
|
转换数据类型(例如, |
|
大小为 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT成功创建FFT计划。 |
|
|
|
为计划分配GPU内存失败。 |
|
向API传递一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.3.3. Function mcfftMakePlan2d()
mcfftResult
mcfftMakePlan2d(mcfftHandle plan, int nx, int ny, mcfftType type,
size_t *workSize);
在调用 mcfftCreate() 之后,根据指定的信号大小和数据类型创建一个二维FFT计划配置。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
由 |
|
在x维度的变换大小。这是变换中最慢变化的维度。 (跨距存储)。 |
|
在y维度的变换大小。这是变换中最快变化的维度。 (连续存储)。 |
|
变换的数据类型 (例如, |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功创建了 FFT 计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.3.4. Function mcfftMakePlan3d()
mcfftResult
mcfftMakePlan3d(mcfftHandle plan, int nx, int ny, int nz, mcfftType type,
size_t *workSize);
调用 mcfftCreate() 后,根据指定的信号大小和数据类型进行三维FFT规划配置。除了第三个大小参数 nz 以外,这个函数与 mcfftPlan2d() 相同。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
输入
|
由 |
|
在x维度的变换大小。这是变换中变化最慢的维度。 (跨距存储)。 |
|
在y维度上的变换大小。 |
|
在z维度上的变换大小。这是变换的变化最快维度。 (连续存储)。 |
|
变换的数据类型 (例如, |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功创建了 FFT 计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.3.5. Function mcfftMakePlanMany()
mcfftResult
mcfftMakePlanMany(mcfftHandle plan, int rank, int *n, int *inembed,
int istride, int idist, int *onembed, int ostride,
int odist, mcfftType type, int batch, size_t *workSize);
在调用 mcfftCreate() 之后,会创建一个维度为 rank 的FFT规划配置,其大小由数组 n 指定。输入参数 batch 告诉mcFFT需要配置多少个变换。通过这个函数,可以创建一维、二维或三维的批处理计划。
mcfftPlanMany() API通过高级数据布局参数支持更复杂的输入和输出数据布局: inembed、 istride、 idist、 onembed、 ostride 和 odist。
如果 inembed 和 onembed 设置为 NULL,则其他步幅信息将被忽略,并且使用默认步幅。默认情况下假设数据数组是连续的。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
所有数组被假定在CPU内存中
输入
|
由 |
|
变换的维度 (1, 2, 或 3)。 |
|
大小为 |
|
大小为 |
|
表示两个连续输入元素在最低有效维度(即最内层) 之间的距离 |
|
表示一批输入数据中两个连续信号的第一个元素之间的距离 |
|
大小为 |
|
表示两个连续输出元素在最低有效维度(即最内层) 之间的距离 |
|
表示一批输出数据中两个连续信号的第一个元素之间的距离 |
|
变换的数据类型(例如, |
|
此变换的单批数据的大小。 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功创建了 FFT 计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
至少存在一个大小不受支持的无效参数。 |
3.3.6. Function mcfftMakePlanMany64()
mcfftResult
mcfftMakePlanMany64(mcfftHandle plan, int rank,
long long int *n,
long long int *inembed, long long int istride, long long int idist,
long long int *onembed, long long int ostride, long long int odist,
mcfftType type,
long long int batch, size_t *workSize);
在调用 mcfftCreate() 之后,会创建一个维度为 rank 的FFT规划配置,其大小由数组 n 指定。输入参数 batch 告诉mcFFT需要配置多少个变换。通过这个函数,可以创建一维、二维或三维的批处理计划。
这个API与 mcfftMakePlanMany 完全相同,只是指定尺寸和步幅的参数是64位整数。这个API使得大规模变换成为可能。
mcFFT包括使用32位索引和使用64位索引的内核。mcFFT计划在可能的情况下选择使用32位内核,以避免由于64位算术而引起的任何开销。
此接口支持所有大小和类型的变换,只有两个例外。对于大小超过4G元素的变换,数组n中指定的维度必须是小于等于17的可分解质数。对于大小超过4G元素的实数到复数和复数到实数变换,最快变化的维度必须是偶数。
mcfftPlanMany64() API通过高级数据布局参数支持更复杂的输入和输出数据布局: inembed、 istride、 idist、 onembed、 ostride 和 odist。
如果 inembed 和 onembed 被设置为 NULL,则其他步幅信息将被忽略,并且使用默认步幅。默认情况下假设数据数组是连续的。
该调用对给定的句柄只能使用一次。
如果计划已被锁定,即句柄之前被不同的 mcfftPlan 或 mcfftMakePlan 调用使用过,此调用将失败并返回 MCFFT_INVALID_PLAN 。
所有数组被假定在CPU内存中。
输入
|
由 |
|
变换的维度 (1, 2, 或 3)。 |
|
大小为 |
|
大小为 |
|
表示两个连续输入元素在最低有效维度(即最内层) 之间的距离。 |
|
表示一批输入数据中两个连续信号的第一个元素之间的距离 |
|
大小为 |
|
表示两个连续输出元素在最低有效维度(即最内层) 之间的距离 |
|
表示一批输出数据中两个连续信号的第一个元素之间的距离 |
|
变换的数据类型(例如, |
|
此变换的单批数据的大小 |
|
指向工作区大小的指针,以字节为单位 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功创建了 FFT 计划。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
至少存在一个大小不受支持的无效参数。 |
3.4. mcFFT估算工作区大小
在执行计划过程中,mcFFT需要一个工作区来临时存储中间结果。 mcfftEstimate*() 函数调用根据指定的参数和默认计划设置返回所需工作区大小的估计值。某些问题需要比其他问题更多的存储空间。
就临时存储而言,二次幂尤其高效。
然而,大的素数使用不同的算法,可能需要多达类似大小的二次幂的8倍存储空间。
这些函数返回的 workSize 值可能仍然小于实际需要的值,尤其是对于不是2、3、5和7次幂倍数的 n 值。更精确的值可以通过 mcfftGetSize*() 函数获得,但这些值可能仍然相对保守。
3.4.1. Function mcfftEstimate1d()
mcfftResult
mcfftEstimate1d(int nx, mcfftType type, int batch, size_t *workSize);
在计划执行过程中,mcFFT需要一个工作区来临时存储中间结果。该函数调用根据指定的参数和假设的默认计划设置返回所需工作区大小的估计值。
输入
|
变换的大小 (例如, 256 表示 256点FFT)。 |
|
变换的数据类型 (例如 |
|
大小为 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT成功返回了工作区大小。 |
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
|
3.4.2. Function mcfftEstimate2d()
mcfftResult
mcfftEstimate2d(int nx, int ny, mcfftType type, size_t *workSize);
在计划执行过程中,mcFFT需要一个工作区来临时存储中间结果。该函数调用根据指定的参数和假设的默认计划设置返回所需工作区大小的估计值。
输入
|
在x维度上的变换大小(行数)。 |
|
在y维度上的变换大小(列数)。 |
|
变换的数据类型(例如, |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT成功返回了工作区的大小。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.4.3. Function mcfftEstimate3d()
mcfftResult
mcfftEstimate3d(int nx, int ny, int nz, mcfftType type, size_t *workSize);
在计划执行过程中,mcFFT需要一个工作区来临时存储中间结果。该函数调用根据指定的参数和假设的默认计划设置返回所需工作区大小的估计值。
输入
|
在x维度上的变换大小。 |
|
在y维度上的变换大小。 |
|
在z维度上的变换大小。 |
|
变换的数据类型(例如, |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
Return Values
|
mcFFT成功返回了工作区大小。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.4.4. Function mcfftEstimateMany()
mcfftResult
mcfftEstimateMany(int rank, int *n, int *inembed,
int istride, int idist, int *onembed, int ostride,
int odist, mcfftType type, int batch, size_t *workSize);
在计划执行过程中,mcFFT需要一个工作区来临时存储中间结果。该函数调用根据指定的参数和假设的默认计划设置返回所需工作区大小的估计值。
mcfftPlanMany() API通过高级数据布局参数支持更复杂的输入和输出数据布局: inembed、 istride、 idist、 onembed、 ostride 和 odist。
假定所有数组在GPU内存中。
输入
|
变换的维度 (1, 2, 或 3)。 |
|
大小为 |
|
大小为 |
|
表示两个连续输入元素在最低有效维度(即最内层) 之间的距离 |
|
表示一批输入数据中两个连续信号的第一个元素之间的距离 |
|
大小为 |
|
表示两个连续输出元素在最低有效维度(即最内层) 之间的距离 |
|
表示批处理变换输出数据中两个连续信号的第一个 元素之间的距离。 |
|
变换的数据类型(例如, |
|
此变换的批处理大小。 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功创建了 FFT 计划。 |
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
至少存在一个大小不受支持的无效参数。 |
3.5. 优化后mcFFT估算工作区大小
mcfftGetSize*() 函数比 mcfftEstimate*() 函数提供了更准确的计划所需工作区大小的估计,因为在于考虑了可能已进行的任何计划设置。
正如在 mcFFT估算工作区大小 部分中所讨论的那样,返回的 workSize 值可能过于保守,尤其是当 n 不是2、3、5和7的幂的倍数的情况。
3.5.1. Function mcfftGetSize1d()
mcfftResult
mcfftGetSize1d(mcfftHandle plan, int nx, mcfftType type, int batch,
size_t *workSize);
与 mcfftEstimate1d() 相比,在给定参数并考虑了可能已经进行的任何计划设置的情况下, mcfftGetSize1d() 调用给出的计划所需工作区大小更为准确。
输入
|
由 |
|
变换的大小 (例如, 256 表示 256点FFT)。 |
|
变换的数据类型(例如,单精度复数到
复数的 |
|
大小为nx的变换数量。请考虑使用 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT成功返回了工作区大小。 |
|
|
|
为计划分配GPU资源失败。 |
|
向API传递了一个或多个无效参数。 |
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
|
参数 |
3.5.2. Function mcfftGetSize2d()
mcfftResult
mcfftGetSize2d(mcfftHandle plan, int nx, int ny, mcfftType type,
size_t *workSize);
在指定参数并考虑到可能的任何计划设置的情况下,调用 mcfftGetSize2d() 会比 mcfftEstimate2d() 更准确地估算计划所需的工作区大小。
输入
|
|
|
x 维度上的变换大小(行数)。 |
|
Y 维度上的变换大小(列数)。 |
|
转换数据类型
(例如 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功返回了工作区的大小。 |
|
|
|
为计划分配 GPU 资源失败。 |
|
向 API 传递了一个或多个无效参数。 |
|
检测到一个内部驱动程序错误。 |
|
mcFFT 库初始化失败。 |
|
参数 |
3.5.3. Function mcfftGetSize3d()
mcfftResult
mcfftGetSize3d(mcfftHandle plan, int nx, int ny, int nz, mcfftType type,
size_t *workSize);
在指定参数并考虑到任何可能的计划设置的情况下,调用 mcfftGetSize3d() 会比 mcfftEstimate3d() 更准确地估算计划所需的工作区大小。
输入
|
由 |
|
在x维度上的变换大小。 |
|
在y维度上的变换大小。 |
|
在z维度上的变换大小。 |
|
转换数据类型
(例如 |
|
指向工作区大小的指针(字节)。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功返回了工作区的大小。 |
|
|
|
为计划分配 GPU 资源失败。 |
|
向 API 传递了一个或多个无效参数。 |
|
检测到一个内部驱动程序错误。 |
|
mcFFT 库初始化失败。 |
|
至少存在一个大小不受支持的无效参数。 |
3.5.4. Function mcfftGetSizeMany()
mcfftResult
mcfftGetSizeMany(mcfftHandle plan, int rank, int *n, int *inembed,
int istride, int idist, int *onembed, int ostride,
int odist, mcfftType type, int batch, size_t *workSize);
在指定参数并考虑到任何可能的计划设置的情况下,该调用会比 mcfftEstimateSizeMany() 更准确地估算计划所需的工作区大小。
输入
|
|
|
转换的维度(1、2 或 3)。 |
|
表示 |
|
指向 |
|
表示两个连续输入元素在最低有效维度(即最内层)上的 距离。 |
|
表示一批输入数据中两个连续信号彼此之间第一个元素相距 的距离。 |
|
指向 |
|
该参数表示输出数组中相邻输出元素在最低有效维度 (即最内层)上的间距。 |
|
表示一批输出数据中两个连续信号彼此之间第一个元素相距 的距离。 |
|
变换数据类型 (例如,可以使用 |
|
这个变换的批量大小。 |
|
指向工作区大小(以字节为单位)的指针。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功返回了工作区的大小。 |
|
|
|
为该计划分配 GPU 资源失败。 |
|
向 API 传递了一个或多个无效参数。 |
|
检测到一个内部驱动程序错误。 |
|
mcFFT 库初始化失败。 |
|
存在一个或多个无效参数。 |
3.5.5. Function mcfftGetSizeMany64()
mcfftResult
mcfftGetSizeMany64(mcfftHandle plan, int rank,
long long int *n,
long long int *inembed, long long int istride, long long int idist,
long long int *onembed, long long int ostride, long long int odist,
mcfftType type,
long long int batch, size_t *workSize);
在指定参数并考虑到任何可能计划设置的情况下,调用 mcfftGetSizeMany64() 会比 mcfftEstimateSizeMany() 更准确地估算计划所需的工作区大小。
这个API与 mcfftMakePlanMany 相同,只是指定大小和步幅的参数是64位整数。这个API使得大规模变换成为可能。mcFFT可以使用32位索引或64位索引的内核。
mcFFT在可能的情况下会选择使用32位内核,以避免由于64位运算而产生额外的开销。
这个接口支持所有大小和类型的变换,但有两个例外。首先对于总大小超过4G个元素的变换,数组 n 中指定的维度必须能够分解为小于或等于17的质数。
其次对于总大小超过4G个元素的实数到复数与复数到实数的变换,最快变化的维度必须是偶数。
输入
|
由 |
|
转换的维度(1、2 或 3)。 |
|
表示 |
|
指向 |
|
表示两个连续输入元素在最低有效维度(即最内层)上的 距离。 |
|
表示一批输入数据中两个连续信号的第一个元素之间的距离 |
|
指向大小为 |
|
该参数表示输出数组中相邻输出元素在最低有效维度 (即最内层)上的间距。 |
|
表示一批输出数据中两个连续信号的第一个元素之间的距离 |
|
变换数据类型 (例如,对于单精度实数到复数的变换,
可以使用 |
|
此变换的单批数据的大小。 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功返回了工作区的大小。 |
|
|
|
为计划分配 GPU 资源失败。 |
|
向 API 传递了一个或多个无效参数。 |
|
检测到一个内部驱动程序错误。 |
|
mcFFT 库初始化失败。 |
|
至少存在一个大小不受支持的无效参数。 |
3.6. Function mcfftGetSize()
mcfftResult
mcfftGetSize(mcfftHandle plan, size_t *workSize);
此调用在使用原始 API 或扩展 API 生成计划后,会返回该计划所需的实际工作区大小。 选择在其应用程序中管理工作区分配的调用者必须在计划生成后使用此调用,如果在计划生成后调用任意 mcfftSet*() ,可能会改变所需的工作区大小,也必须使用此调用。
输入
|
由 |
|
指向工作区大小的指针,以字节为单位。 |
输出
|
指向工作区大小的指针。 |
返回值
|
mcFFT 成功返回了工作区的大小。 |
|
|
|
为计划分配 GPU 资源失败。 |
3.7. mcFFT 调用器分配工作区支持
3.7.1. Function mcfftSetAutoAllocation()
mcfftResult
mcfftSetAutoAllocation(mcfftHandle plan, int autoAllocate);
mcfftSetAutoAllocation() 表示调用者打算为已生成的计划分配和管理工作区。mcFFT默认在计划生成时分配工作区。
如果在调用任意 mcfftMakePlan*() 之前调用了 mcfftSetAutoAllocation(),并将 autoAllocate 设置为 0(false),则 mcFFT 不会分配工作区。对于希望管理工作区域分配的调用者来说,这是首选顺序。
输入
|
由 |
|
表示是否分配工作区。 |
返回值
|
mcFFT 成功返回了工作区的大小。 |
|
|
|
检测到一个内部驱动程序错误。 |
3.7.2. Function mcfftSetWorkArea()
mcfftResult
mcfftSetWorkArea(mcfftHandle plan, void *workArea);
mcfftSetWorkArea()重写了与计划相关联的工作区指针。如果工作区是自动分配的,mcFFT会释放自动分配的空间。mcfftExecute*()调用假设工作区指针是有效的,并且它指向设备内存中的一个连续区域,不与任何其他工作区重叠。无法保证该情况以外的结果。
输入
|
由 |
|
指向工作区的指针。 |
返回值
|
mcFFT成功允许用户覆盖工作区指针。 |
|
|
|
检测到内部驱动程序错误。 |
|
mcFFT库初始化失败。 |
3.8. Function mcfftDestroy()
mcfftResult
mcfftDestroy(mcfftHandle plan);
释放与mcFFT计划相关的所有GPU资源,并销毁内部计划数据结构。一旦不再需要计划, mcfftDestroy() 就被调用以避免浪费GPU内存。
输入
|
要销毁的计划中 |
返回值
|
mcFFT成功销毁了FFT计划。 |
|
|
3.9. 执行mcFFT
3.9.1. Function mcfftExecC2C() 和 mcfftExecZ2Z()
mcfftResult
mcfftExecC2C(mcfftHandle plan, mcfftComplex *idata,
mcfftComplex *odata, int direction);
mcfftResult
mcfftExecZ2Z(mcfftHandle plan, mcfftDoubleComplex *idata,
mcfftDoubleComplex *odata, int direction);
mcfftExecC2C() (mcfftExecZ2Z()) 函数根据 direction 参数指定的变换方向执行单精度(双精度)复数到复数的变换计划。 mcFFT使用由 idata 参数指向的GPU内存作为输入数据。 该函数将傅里叶系数存储在 odata 数组中。 如果 idata 和 odata 相同,这个方法将执行原地变换。
输入
|
由 |
|
指向要进行变换的复数输入数据(存储在GPU内存中) 的指针。 |
|
指向复数输出数据(存储在GPU内存中)的指针 |
|
变换路径: |
输出
|
包含复数傅里叶系数。 |
返回值
|
mcFFT成功执行了FFT 计划。 |
|
|
|
|
|
检测到内部驱动程序错误。 |
|
mcFFT在GPU上执行变换失败。 |
|
mcFFT库初始化失败。 |
3.9.2. Function mcfftExecR2C() 和 mcfftExecD2Z()
mcfftResult
mcfftExecR2C(mcfftHandle plan, mcfftReal *idata, mcfftComplex *odata);
mcfftResult
mcfftExecD2Z(mcfftHandle plan, mcfftDoubleReal *idata, mcfftDoubleComplex *odata);
mcfftExecR2C() (mcfftExecD2Z()) 函数运行单精度(双精度)实数到复数的正向mcFFT变换。 mcFFT使用由 idata 参数指向的GPU内存作为输入数据。该函数将非冗余的傅里叶系数存储在 odata 数组中。 在单精度变换中 idata 和 odata 指针都需要对齐到 mcfftComplex 数据类型,而在双精度变换中则需要对齐到 mcfftDoubleComplex 数据类型。 如果 idata 和 odata 相同, mcfftExecR2C() (mcfftExecD2Z()) 将执行原地变换。 正如 Parameter mcfftType 中所述,请注意在原地变换和非原地变换之间存在数据布局的差异。
输入
|
由 |
|
指向要进行变换的实数输入数据(存储在GPU内存中)的指针。 |
|
指向复数输出数据(存储在GPU内存中)的指针。 |
输出
|
包含复数傅里叶系数。 |
返回值
|
mcFFT成功执行了FFT计划。 |
|
|
|
|
|
检测到内部驱动程序错误。 |
|
mcFFT在GPU上执行变换失败。 |
|
mcFFT库初始化失败。 |
3.9.3. Function mcfftExecC2R() 和 mcfftExecZ2D()
mcfftResult
mcfftExecC2R(mcfftHandle plan, mcfftComplex *idata, mcfftReal *odata);
mcfftResult
mcfftExecZ2D(mcfftHandle plan, mcfftDoubleComplex *idata, mcfftDoubleReal *odata);
mcfftExecC2R() (mcfftExecZ2D()) 函数运行单精度(双精度)实数到复数的逆向mcFFT变换。mcFFT使用由 idata 参数指向的GPU内存作为输入数据。输入数组仅包含非冗余的复数傅里叶系数。该函数将实数输出值存储在 odata 数组中。 并且在单精度变换中指针需要对齐到 mcfftComplex 数据类型,而在双精度变换中指针则需要对齐到 mcfftDoubleComplex 数据类型。 如果 idata 和 odata 相同, mcfftExecC2R() (mcfftExecZ2D())将执行原地变换。
输入
|
由 |
|
指向要进行变换的复数输入数据(存储在GPU内存中)的指针。 |
|
指向实数输出数据(存储在GPU内存中)的指针。 |
输出
|
包含实数输出数据。 |
返回值
|
mcFFT成功执行了FFT计划。 |
|
|
|
|
|
检测到内部驱动程序错误。 |
|
mcFFT在GPU上执行变换失败。 |
|
mcFFT库初始化失败。 |
3.10. Function mcfftSetStream()
mcfftResult
mcfftSetStream(mcfftHandle plan, mcStream_t stream);
将MXMACA流与mcFFT计划相关联。现在在计划执行期间的所有内核启动都将通过与之相关联的流进行,从而实现与其他流(例如数据复制)的并行。这种关联会一直保持直到计划被销毁或者有其它程序调用另一个 mcfftSetStream() 更改流为止。
输入
|
与流关联的 |
|
使用 |
状态返回
|
表示流已与计划关联。 |
|
|
3.11. Function mcfftGetVersion()
mcfftResult
mcfftGetVersion(int *version);
返回mcFFT的版本号。
输入
|
指向版本号的指针。 |
输出
|
包含版本号的变量。 |
返回值
|
mcFFT 成功返回了版本号。 |
3.12. Function mcfftGetProperty()
mcfftResult
mcfftGetProperty(mcfftLibraryPropertyType type, int *value);
将动态链接的mcFFT库的 type 属性数值返回到 *value 中。
输入
|
mcFFT库的属性。 |
输出
|
包含所请求属性的整数值。 |
返回值
|
成功返回了属性值。 |
|
未识别到属性类型。 |
|
|
3.13. mcFFT类型
3.13.1. 参数mcfftType
mcFFT库支持复数数据和实数数据的变换。 mcfftType 数据类型是mcFFT支持的变换数据类型的枚举。
typedef enum mcfftType_t {
MCFFT_R2C = 0x2a, // 实数到复数(交错)
MCFFT_C2R = 0x2c, // 复数(交错)到实数
MCFFT_C2C = 0x29, // 复数到复数(交错)
MCFFT_D2Z = 0x6a, // 双精度到双精度复数(交错)
MCFFT_Z2D = 0x6c, // 双精度复数(交错)到双精度
MCFFT_Z2Z = 0x69 // 双精度复数到双精度复数(交错)
} mcfftType;
3.13.2. 变换方向的参数
mcFFT库根据复数指数项的符号定义正向和逆向的快速傅里叶变换。
#define MCFFT_FORWARD -1
#define MCFFT_INVERSE 1
mcFFT执行非归一化FFT:也就是说在输入数据集上执行正向FFT,然后在输出数据集上执行逆向FFT就可得到与输入相等的数据。用户可以根据数据集大小的倒数对任一变换进行缩放操作,缩放操作通过除以元素的数量进行缩放。
3.13.3. 其他mcFFT类型
3.13.3.1. mcfftHandle
这是一个用于存储和访问mcFFT计划的句柄类型。用户在创建mcFFT计划后会获得一个句柄并且需要使用该句柄来执行计划。
typedef unsigned int mcfftHandle;
3.13.3.2. mcfftReal
单精度浮点实数数据类型。
typedef float mcfftReal;
3.13.3.3. mcfftDoubleReal
双精度浮点实数数据类型。
typedef double mcfftDoubleReal;
3.13.3.4. mcfftComplex
单精度浮点复数数据类型由交错的实部和虚部组成。
typedef mcComplex mcfftComplex;
3.13.3.5. mcfftDoubleComplex
双精度浮点复数数据类型由交错的实部和虚部组成。
typedef mcDoubleComplex mcfftDoubleComplex;
3.13.3.6. mcfftLibraryPropertyType
mcfftLibraryPropertyType 数据类型是库属性类型的枚举。如,mcFFT版本X.Y.Z将枚举产生 MCFFT_VER_MAJOR=X,MCFFT_VER_MINOR=Y,MCFFT_VER_PATCH=Z。
typedef enum mcfftLibraryPropertyType_t
{
MCFFT_VER_MAJOR,
MCFFT_VER_MINOR,
MCFFT_VER_PATCH
} mcfftLibraryPropertyType;
3.14. 常见的类型
3.14.1. mcComplex
用于表示具有单精度实部与虚部的复数的类。 拥有两个float成员变量x和y,分别表示复数的实部和虚部。
3.14.2. mcDoubleComplex
用于表示具有双精度实部与虚部的复数的类。 拥有两个double成员变量x和y,分别表示复数的实部和虚部。