【问题标题】:Multi-GPU batched 1D FFTs: only a single GPU seems to work多 GPU 批处理 1D FFT:似乎只有一个 GPU 可以工作
【发布时间】:2020-04-27 07:44:27
【问题描述】:

我在 RHEL 8 上使用 CUDA 工具包版本 10.2.89 安装了三台 Tesla V100。

我正在尝试计算行主矩阵列的一批 1D FFT。在下面的示例中,矩阵为 16x8,因此对于三个 GPU,我希望 GPU 0 执行前 3 列的 FFT,GPU 1 执行接下来 3 列的 FFT,GPU 2 执行最后 2 列的 FFT .

示例中创建的计划在单个 GPU 上按预期工作,但在三个 GPU 上运行时,仅计算前三列(正确),其余部分保持不变。

当我检查由 cufftXtMalloc 填充的描述符时,我发现它在 GPU 0 和 1 上为 123 个元素分配了空间,在 GPU 2 上为 122 个元素分配了空间。这看起来很奇怪:我预计 GPU 上的 48=16*3 GPU 2 上的 0 和 1 和 32=16*2。事实上,这是 cufftMakePlanMany 填充的工作空间的大小。当我检查复制的数据时,元素 0-122 位于 GPU 0 上的缓冲区中,元素 123-127 位于 GPU 1 上缓冲区的开头。该缓冲区的其余部分和 GPU 2 上的缓冲区是垃圾.

此外,当我将行数增加到 1024 时,我在 cufftXtFree 调用中收到一个 SIGABRT,并显示消息“free():损坏的未排序块”。

#include "cufft.h"
#include "cufftXt.h"
#include <vector>
#include <cuComplex.h>
#include <cassert>

#define CUDA_CHECK(x) assert(x == cudaSuccess)
#define CUFFT_CHECK(x) assert(x == CUFFT_SUCCESS)

int main() {
    static const int numGPUs = 3;
    int gpus[numGPUs] = {0, 1, 2};

    int nr = 16;
    int nc = 8;

    // Fill with junk data
    std::vector<cuFloatComplex> h_x(nr * nc);
    for (int i = 0; i < nr * nc; ++i) {
        h_x[i].x = static_cast<float>(i);
    }

    cufftHandle plan;
    CUFFT_CHECK(cufftCreate(&plan));
    CUFFT_CHECK(cufftXtSetGPUs(plan, numGPUs, gpus));

    std::vector<size_t> workSizes(numGPUs);
    int n[] = {nr};

    CUFFT_CHECK(cufftMakePlanMany(plan,
                                  1, // rank
                                  n, // n
                                  n, // inembed
                                  nc, // istride
                                  1, // idist
                                  n, // onembed
                                  nc, // ostride
                                  1, // odist
                                  CUFFT_C2C,
                                  nc,
                                  workSizes.data()));

    cudaLibXtDesc *d_x;
    CUFFT_CHECK(cufftXtMalloc(plan, &d_x, CUFFT_XT_FORMAT_INPLACE));

    CUFFT_CHECK(cufftXtMemcpy(plan, d_x, (void *)h_x.data(), CUFFT_COPY_HOST_TO_DEVICE));

    CUFFT_CHECK(cufftXtExecDescriptorC2C(plan, d_x, d_x, CUFFT_FORWARD));

    std::vector<cuFloatComplex> h_out(nr * nc);
    CUFFT_CHECK(cufftXtMemcpy(plan, (void *)h_out.data(), d_x, CUFFT_COPY_DEVICE_TO_HOST));

    CUFFT_CHECK(cufftXtFree(d_x));
    CUFFT_CHECK(cufftDestroy(plan));

    CUDA_CHECK(cudaDeviceReset());

    return 0;
}

【问题讨论】:

  • from here "不支持跨步输入输出"

标签: c++ cuda cufft


【解决方案1】:

感谢@RobertCrovella 的回答:

根据the documentation,从 CUDA 10.2.89 开始,多 GPU 转换不支持跨步输入和输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2021-02-06
    相关资源
    最近更新 更多