0

初めての CUDA アプリに問題があります。基本的には、N 個の線形微分方程式を生成し、それらを一次法を使用して数値的に解く必要があります。変数(時間) は、ステップ = = 0.0001でt0 から反復します。が十分に小さい場合(たとえば 0.001)、すべて問題ありませんが、== 0.1 以上の場合、カーネルは何もしないようです。この状況を調べるにはどうすればよいですか?TTAUTT

N- 方程式の数TAU- 時間ステップTN- ブロックあたりのスレッド数T- 終了時間

変数rは何もしません。カーネルが何かを行うかどうかを確認するために使用しました。したがって、T== 0.0001 の場合はr== 283 ですが、T== 0.1 の場合はr== 0 です。

#include <stdio.h>
#include <math.h>
#include <time.h>

#define N 4096
#define TAU 0.0001f
#define TN 2
#define T 0.1f
#define PI 3.141592f

__global__ void kern(float* v, float* m, float* r)
{
    *r = 283;
    __syncthreads();
    int tid = blockIdx.x*TN + threadIdx.x;

    for(float t = 0; t <= T; t += TAU)
    {
        float f = 0;
        __syncthreads();
        for(int k = 0; k < N; ++k)
            f += m[N*tid + k]*v[k];
        f *= TAU;
        f += v[tid];
        __syncthreads();
        v[tid] = f;
    }
}

int main()
{
    float* v = new float[N];
    float* m = new float[N*N];

    for(int i = 0; i < N; ++i)
        v[i] = sin(2*PI*i/N); //setting initial conditions

    for(int i = 0; i < N*N; ++i)
        m[i] = cos(2*PI*i/(N*N)); //coefficients in right hand part of the equations

    // printing some of the values (total: 8 values) to compare with result
    for(int i = 0; i < N*N; i += N*N / 8) printf("%f ", m[i]); printf("\n\n");
    for(int i = 0; i < N; i += N / 8) printf("%f ", v[i]); printf("\n");

    float* cv;
    float* cm;
    float* cr;
    cudaMalloc((void**)&cv, N*sizeof(float));
    cudaMalloc((void**)&cm, N*N*sizeof(float));
    cudaMalloc((void**)&cr, sizeof(float));

    cudaMemcpy(cv, v, N*sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(cm, m, N*N*sizeof(float), cudaMemcpyHostToDevice);

    dim3 blocks(N / TN);
    dim3 threads(TN);

    time_t ts = time(0);
    printf("starting kernel\n");
    kern<<<blocks, threads>>>(cv, cm, cr);
    printf("kernel stopped\n");
    time_t ts_end = time(0);

    cudaMemcpy(v, cv, N*sizeof(float), cudaMemcpyDeviceToHost);
    float r;
    cudaMemcpy(&r, cr, sizeof(float), cudaMemcpyDeviceToHost);

    for(int i = 0; i < N; i += N / 8) printf("%f ", v[i]); printf("\n");
    printf("%d\n", ts_end - ts);
    printf("result: %f\n", r);


    delete[] m;
    delete[] v;

    cudaFree(cv);
    cudaFree(cm);
    cudaFree(cr);
}
4

2 に答える 2

1

cuda api呼び出しを呼び出すときは、常に戻りコードを確認してください。

ほとんどの場合、APIエラーが原因でプログラムが実行されていない可能性があります。

于 2012-08-08T18:16:57.687 に答える
1

「カーネル停止」とはどういう意味ですか? 62行目からのプリントアウトのことですか?

カーネルの起動は非同期であることに注意してください。つまり、61 行目はカーネルが完了するのを待ちません。カーネルの起動後に「cudaDeviceSynchronize」を使用して、カーネルの完了を待つ必要があります。cudaMemcpy もカーネルの起動時に同期されることに注意してください。

于 2012-08-08T19:39:49.213 に答える