0

cufft ライブラリを正しく使用できるようにするための簡単なプログラムを作成しました。「1」のバッチサイズを実行すると、期待どおりの結果が得られます。ただし、バッチ サイズを大きくすると、データ バッファーの末尾にランダムなバイトのように見えるものが表示されます。バッチ サイズが 2 の場合、最後の 3 つのエントリはノイズです。バッチ サイズが 3 の場合、バッファの最後の 6 つのエントリと、バッチ内の 3 つの変換の 2 番目の結果であるはずの最後の 3 つのエントリにノイズが発生します。

バッチ内の 2 番目の変換の結果の最後にある不良データの例:

7.680291 1.411589← 良いデータ
7.748493 1.062853
7.797380 0.710554
7.826757 0.355854
-436781318144.000000 -436781318144.000000← 悪い結果の始まり ←
5349828096.000000 5000401408.000000
5511789568.000000 4813803008.000000
5664713728.000000 4619900416.000000
出力の終わり

コード:

#define NX 1024
#define BATCH 4

#include <cuda.h>
#include <cufft.h>
#include <stdio.h>
#include <Windows.h>
#include <math.h>

int main()
{
    cufftHandle plan;
    cufftComplex *deviceData;
    cufftComplex *hostData;
    FILE* output;
    char fileName[256];

    int i, j;

    cudaMalloc((void**)&deviceData, NX * BATCH * sizeof(cufftComplex));
    hostData = (cufftComplex*)malloc(NX * BATCH * sizeof(cufftComplex);

    //Initalize array with a real sin wave, increasing the frequency of the wave for each transform in the batch (indexed by "j")
    for (j = 0; j < BATCH; j++)
    {
        for (i = 0; i < NX; i++)
        {
            hostData[i + j*BATCH].x = sin(i*(j+1) / (float)10);
            hostData[i + j*BATCH].y = 0;
        }
    }

    cudaMemcpy(deviceData, hostData, NX * BATCH * sizeof(cufftComplex), cudaMemcpyHostToDevice);
    cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);
    cufftExecC2C(plan, deviceData, deviceData, CUFFT_FORWARD);
    cudaThreadSynchronize();
    cudaMemcpy(hostData, deviceData, NX * BATCH * sizeof(cufftComplex), cudaMemcpyDeviceToHost);
    cufftDestroy(plan);
    cudaFree(deviceData);

    output = fopen("outputFile.txt", "w");

    //Write one file for each transform in the batch
    for (j = 0; j < BATCH; j++)
    {
        memset(fileName, '\0', 256);
        sprintf(fileName, "outputFile_%d.txt", j);
        output = fopen(fileName, "w");
        for (i = 0; i < NX; i++)
            fprintf(output, "%f\t%f\n", hostData[i + j*BATCH].x, hostData[i + j*BATCH].y);
        fclose(output);
    }
}
4

1 に答える 1

2

BATCHとNXの使用法を混同して、データセットにインデックスを付けています。

私はあなたの最終的なfprintf行はあなたが持っているものの代わりにこれであるべきだと思います:

fprintf(output, "%f\t%f\n", hostData[i + j*NX].x, hostData[i + j*NX].y);

同様に、データ設定行をから変更する必要があります

hostData[i + j*BATCH]...

hostData[i + j*NX]...

(2インスタンス。)

そして、私たちがそれに取り組んでいる間、この行は私のためにコンパイルされません、それは閉じ括弧が欠けています:

hostData = (cufftComplex*)malloc(NX * BATCH * sizeof(cufftComplex);
于 2012-11-29T04:45:19.167 に答える