日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CUDA 中 FFT 的使用

發布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CUDA 中 FFT 的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CUDA 中 FFT 的使用

@(10.CUDA)[CUDA,并行,fft]

1. 流程

  • 使用cufftHandle創建句柄
  • 使用cufftPlan1d(),cufftPlan3d(),cufftPlan3d(),cufftPlanMany()對句柄進行配置,主要是配置句柄對應的信號長度,信號類型,在內存中的存儲形式等信息。
    • cufftPlan1d():針對單個 1 維信號
    • cufftPlan2d():針對單個 2 維信號
    • cufftPlan3d():針對單個 3 維信號
    • cufftPlanMany():針對多個信號同時進行 fft
  • 使用cufftExec()函數執行 fft
  • 使用cufftDestroy()函數釋放 GPU 資源
  • 2. 單個 1 維信號的 fft

    假設要執行 fft 的信號data_dev的長度為N,并且已經傳輸到 GPU 顯存中,data_dev數據的類型為cufftComplex,可以用一下方式產生主機段的data_dev,如下所示:

    cufftComplex *data_Host = (cufftComplex*)malloc(NX*BATCH*sizeof(cufftComplex)); // 主機端數據頭指針// 初始數據for (int i = 0; i < NX; i++){data_Host[i].x = float((rand() * rand()) % NX) / NX;data_Host[i].y = float((rand() * rand()) % NX) / NX;}

    然后用cudaMemcpy()將主機端的data_host拷貝到設備端的data_dev,即可用下述方法執行 fft :

    cufftHandle plan; // 創建cuFFT句柄cufftPlan1d(&plan, N, CUFFT_C2C, BATCH);cufftExecC2C(plan, data_dev, data_dev, CUFFT_FORWARD); // 執行 cuFFT,正變換

    cufftPlan1d():

    • 第一個參數就是要配置的 cuFFT 句柄;
    • 第二個參數為要進行 fft 的信號的長度;
    • 第三個CUFFT_C2C為要執行 fft 的信號輸入類型及輸出類型都為復數;CUFFT_C2R表示輸入復數,輸出實數;CUFFT_R2C表示輸入實數,輸出復數;CUFFT_R2R表示輸入實數,輸出實數;
    • 第四個參數BATCH表示要執行 fft 的信號的個數,新版的已經使用cufftPlanMany()來同時完成多個信號的 fft。

    cufftExecC2C():

    • 第一個參數就是配置好的 cuFFT 句柄;
    • 第二個參數為輸入信號的首地址;
    • 第三個參數為輸出信號的首地址;
    • 第四個參數CUFFT_FORWARD表示執行的是 fft 正變換;CUFFT_INVERSE表示執行 fft 逆變換。

    需要注意的是,執行完逆 fft 之后,要對信號中的每個值乘以 $\frac{1}{N}$

    完整代碼:GitHub

    3. 多個 1 維信號的 fft

    要進行多個信號的 fft,就不得不使用 cufftPlanMany 函數,該函數的參數比較多,需要特別介紹,

    cufftPlanMany(cufftHandle *plan, int rank, int *n, int *inembed, int istride, int idist, int *onembed, int ostride, int odist, cufftType type, int batch);

    為了敘述的更準確,此處先引入一個圖,表示輸入數據在內存中的布局,如下圖所示,數據在內存中按行優先存儲,但是現有的信號為一列表示一個信號,后四列灰白色的表示無關數據,要對前 12 個彩色的列信號分別進行 fft。

    • plan:表示 cufft 句柄
    • rank:表示進行 fft 的每個信號的維度數,一維信號為 1,二維信號為2,三維信號為 3 ,針對上圖,rank = 1
    • n:表示進行 fft 的每個信號的行數,列數,頁數,必須用數組形式表示,例如假設要進行 fft 的每個信號的行、列、頁為(m, n, k),則 int n[rank] = {m, n, k};針對上圖,int n[1] = {5}
    • inembed:表示輸入數據的[頁數,列數,行數],這是三維信號的情況;二維信號則為[列數,行數];一維信號為[行數];inembed[0] 這個參數會被忽略,也就是此處 inembed 可以為{0},{1},{2}等等。
    • istride:表示每個輸入信號相鄰兩個元素的距離,在此處 istride = 16(每個信號相鄰兩個元素間的距離為16)
    • idist:表示兩個連續輸入信號的起始元素之間的間隔,在此處為 idist = 1(第一個信號的第一個元素與第二個信號的第一個元素的間隔為1);如果把上圖數據的每一行看成一個信號,那么應該為 idist = 16;
    • onembed:表示輸出數據的[頁數,列數,行數],這是三維信號的情況;二維信號則為[列數,行數];一維信號為[行數];onembed[0] 這個參數會被忽略,也就是此處 onembed 可以為{0},{1},{2}等等。
    • ostride:表示每個輸出信號相鄰兩個元素的距離,在此處 ostride = 16(每個信號相鄰兩個元素間的距離為16)
    • odist:表示兩個連續信號的起始元素之間的間隔,在此處為 odist = 1(第一個信號的第一個元素與第二個信號的第一個元素的間隔為1);如果把上圖數據的每一行看成一個信號,那么應該為 odist = 16;

    如下所示:是第 b 個信號的 [z][y][x] (表示第 z 列,第 y 行,第 x 頁的元素)的索引(由于 c 和 c++ 中數組的聲明方式的問題,array[X][Y][Z]表示數組有 X 頁,Y 行,Z 列) :

    ? 1D

    input[ b * idist + x * istride ]output[ b * odist + x * ostride ]

    ? 2D

    input[ b * idist + (x * inembed[1] + y) * istride ]output[ b * odist + (x * onembed[1] + y) * ostride ]

    ? 3D

    input[b * idist + (x * inembed[1] * inembed[2] + y * inembed[2] + z) * istride]output[b * odist + (x * onembed[1] * onembed[2] + y * onembed[2] + z) * ostride]

    /* 申請 cufft 句柄*/cufftHandle plan_Nfft_Many; // 創建cuFFT句柄const int rank = 1; // 一維 fftint n[rank] = { Nfft }; // 進行 fft 的信號的長度為 Nfftint inembed[1] = { 0 }; // 輸入數據的[頁數,列數,行數](3維);[列數,行數](2維)int onembed[1] = { 0 }; // 輸出數據的[頁數,列數,行數];[列數,行數](2維)int istride = NXWITH0; // 每個輸入信號相鄰兩個元素的距離int idist = 1; // 每兩個輸入信號第一個元素的距離int ostride = NXWITH0; // 每個輸出信號相鄰兩個元素的距離int odist = 1; // 每兩個輸出信號第一個元素的距離int batch = NX; // 進行 fft 的信號個數cufftPlanMany(&plan_Nfft_Many, rank, n, inembed, istride, idist, onembed, ostride, odist, CUFFT_C2C, batch);/* 核心部份 */cudaMemcpy(data_dev, data_Host, Nfft * NXWITH0 * sizeof(cufftComplex), cudaMemcpyHostToDevice);cufftExecC2C(plan_Nfft_Many, data_dev, data_dev, CUFFT_FORWARD); // 執行 cuFFT,正變換cufftExecC2C(plan_Nfft_Many, data_dev, data_dev, CUFFT_INVERSE); // 執行 cuFFT,逆變換CufftComplexScale<<<dimGrid2D_NXWITH0_Nfft, dimBlock2D>>>(data_dev, data_dev, 1.0f / Nfft); // 乘以系數cudaMemcpy(resultIFFT, data_dev, Nfft * NXWITH0 * sizeof(cufftComplex), cudaMemcpyDeviceToHost);

    完整代碼:GitHub

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的CUDA 中 FFT 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲桃色av | 亚洲国产精品无码久久久久高潮 | 丰满人妻一区二区三区四区53 | 嫩草在线观看 | 中文字幕第100页 | 国产成人精品国内自产拍免费看 | 伊人伊人伊人 | 欧美经典一区二区 | 精品少妇久久久久久888优播 | 青青草原国产在线 | 办公室摸腿吻胸激情视频 | 美国一级大黄一片免费中文 | 欧美视频a| 人妖黄色片 | 亚洲欧美日韩国产一区二区三区 | 成人听书哪个软件好 | 免看黄大片aa | 国产激情视频在线观看 | 亚洲精品www| 免费看aaaaa级少淫片 | 欧美色图13p | 美女国产一区 | 会喷水的亲姐姐 | 一区二区三区四区视频 | 浪漫樱花动漫在线观看免费 | 久久r精品 | 亚州福利 | 欧美午夜不卡 | 日日夜夜撸啊撸 | 亚洲精品少妇一区二区 | 四虎影院新网址 | 色大师av一区二区三区 | 国产精品成人99一区无码 | 一级爱爱免费视频 | 国产一区二区观看 | 国内精品在线观看视频 | 国产精品一二三 | 国产精品无码专区av在线播放 | 无码人妻一区二区三区一 | 亚洲av永久无码精品 | 免费在线观看毛片 | 视频一区在线播放 | 免费看黄色片视频 | 国产精品久久久久久久久久久久久久久久久久 | 亚洲天堂网在线观看视频 | 国产成人精品一区二区无码呦 | 亚洲视频在线观看免费视频 | 久一区二区三区 | 久久久18禁一区二区三区精品 | 岛国大片在线 | 久久天堂视频 | 中文字幕+乱码+中文乱 | 亚洲一级特黄毛片 | 免费av不卡在线观看 | 久久精品tv | 深夜福利1000 | 五月婷婷影院 | 5a毛片| 亚洲av少妇一区二区在线观看 | 小草av | 免费av地址| 欧美久久久 | 久久久91精品国产一区二区三区 | 在线观看网站av | 免费美女毛片 | 一区二区激情视频 | 国产精品无码久久久久成人app | 欧美涩涩涩 | 在线观看成人动漫 | 99爱视频在线观看 | 男生操女生在线观看 | 高清免费毛片 | 国产黄色免费大片 | 色婷婷六月 | 亚洲永久免费视频 | 欧美 亚洲 激情 一区 | 91在现看 | www..com黄色| 免费看黄色小视频 | 成人免费网站视频 | 欧美日韩不卡合集视频 | 欧美日韩成人一区二区 | 伊人激情在线 | 日韩国产欧美在线观看 | 欧美在线综合 | 另类小说亚洲色图 | 女人18岁毛片 | 九色丨蝌蚪丨成人 | 日本阿v视频 | 成年免费视频黄网站在线观看 | 国产区精品在线 | 夜夜夜网 | 国产成人一级片 | 亚洲情se| 蜜桃视频在线观看一区二区 | 激情偷乱人成视频在线观看 | 亚洲天堂久久新 | 五月天激情在线 | 日韩成人av网址 |