簡體   English   中英

多 GPU 批處理 1D FFT:似乎只有一個 GPU 可以工作

[英]Multi-GPU batched 1D FFTs: only a single GPU seems to work

我在 RHEL 8 上安裝了三個帶有 CUDA 工具包版本 10.2.89 的 Tesla V100。

我正在嘗試計算行主矩陣列的一批一維 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 0 和 1 上為 48=16*3並且 32=16*2 在 GPU 2 上。實際上這是 cufftMakePlanMany 填充的工作空間的大小。 當我檢查復制的數據時,元素 0-122 位於 GPU 0 上的緩沖區中,元素 123-127 位於 GPU 1 上緩沖區的開頭。該緩沖區的其余部分和 GPU 2 上的緩沖區是垃圾.

此外,當我將行數增加到 1024 時,我會在 cufftXtFree 調用上收到一個 SIGABRT,並帶有消息“free():corrupted unsorted chunks”。

#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;
}

感謝@RobertCrovella 的回答:

根據文檔,從 CUDA 10.2.89 開始,多 GPU 轉換不支持跨步輸入和輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM