1

CUDA を使用して Bessel 関数 (例として J0(x) ) を実行しようとしています。式はこちら ここに画像の説明を入力

結果をいくつかのイプシロン値内に収めようとします。だからここにコードがあります

    __device__ void Bessel_j0(int totalBlocks, int totalThreads, float z, float epsilon, float* result){
            int n = 1;
            *result = 0;

            bool epsilonFlag = true;

            int idx_start;
            int idx_end;

            while(epsilonFlag == true){ 
                initThreadBounds(&idx_start, &idx_end, n, totalBlocks, totalThreads);
                float a_k;
                for (int k = idx_start; k < idx_end; k++) {
                    a_k = m_power((-0.25 * z * z), k)/(m_factorial(k) * m_factorial(k)); 
                    *result += a_k;
                }
                if(a_k < epsilon){
                        epsilonFlag = false;
                }
                n++;
            }
        }

__global__ void J0(int totalBlocks, int totalThreads,  float x, float* result){
        float res = 0;

        Bessel_j0(totalBlocks, totalThreads, 10, 0.01, &res);
        result[(blockIdx.x*totalThreads + threadIdx.x)] = res;
}

__host__ void J0test(){

    const int blocksNum = 32;
    const int threadNum = 32;

    float   *device_resultf; //для устройства
    float   host_resultf[threadNum*blocksNum]   ={0};


    cudaMalloc((void**) &device_resultf, sizeof(float)*threadNum*blocksNum);

    J0<<<blocksNum, threadNum>>>(blocksNum, threadNum, 10, device_resultf); 
    cudaThreadSynchronize();

    cudaMemcpy(host_resultf, device_resultf, sizeof(float)*threadNum*blocksNum, cudaMemcpyDeviceToHost);

    float sum = 0;

    for (int i = 0; i != blocksNum*threadNum; ++i) {
        sum += host_resultf[i];
        printf ("result in %i cell = %f \n", i, host_resultf[i]);
    }
    printf ("Bessel res = %f \n", sum);
    cudaFree(device_resultf);
}
int main(int argc, char* argv[])
{
    J0test();   
}

実行すると黒い画面が表示され、Windows は nVidia ドライバーが応答しなかったと表示し、回復しました。host_resultfまた、コンソール出力では、配列にゼロしかありません。どうしたの?いくつかのイプシロン内で関数を適切に実行するにはどうすればよいですか?

4

1 に答える 1

1

可能性は低いですが、カーネルの実行が許容されるカーネル実行時間の制限に達している可能性があります。あなたのコードは反復回数の上限を示していません。イプシロンに到達せず、カーネルが時間制限を超えて実行し続けることがあります。このサイトが役に立ちます。

すべての場合において、イプシロン ループに上限を追加し、反復回数に制限なしでコードを実行することは決してありません。

于 2013-04-07T14:56:52.217 に答える