2012-03-21 19 views
2

私は最近CUDAの学習を始めました.Nsightを使用してCUDAをMS Visual Studio 2010に統合しました。私はまた、 "CUDA by Example"という本を手に入れました。私はすべての例を通し、それらをコンパイルしています。しかし、私は間違いを知りませんでした。 プログラムは第4章にあり、julia_gpuの例です。オリジナルコード:基本的な例のcudaMemcpyDeviceToHostエラー

#include "../common/book.h" 
#include "../common/cpu_bitmap.h" 

#define DIM 1000 

struct cuComplex { 
    float r; 
    float i; 
    cuComplex(float a, float b) : r(a), i(b) {} 
    __device__ float magnitude2(void) { 
     return r * r + i * i; 
    } 
    __device__ cuComplex operator*(const cuComplex& a) { 
     return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i); 
    } 
    __device__ cuComplex operator+(const cuComplex& a) { 
     return cuComplex(r+a.r, i+a.i); 
    } 
}; 

__device__ int julia(int x, int y) { 
    const float scale = 1.5; 
    float jx = scale * (float)(DIM/2 - x)/(DIM/2); 
    float jy = scale * (float)(DIM/2 - y)/(DIM/2); 

    cuComplex c(-0.8, 0.156); 
    cuComplex a(jx, jy); 

    int i = 0; 
    for (i=0; i<200; i++) { 
     a = a * a + c; 
     if (a.magnitude2() > 1000) 
      return 0; 
    } 

    return 1; 
} 

__global__ void kernel(unsigned char *ptr) { 
    // map from blockIdx to pixel position 
    int x = blockIdx.x; 
    int y = blockIdx.y; 
    int offset = x + y * gridDim.x; 

    // now calculate the value at that position 
    int juliaValue = julia(x, y); 
    ptr[offset*4 + 0] = 255 * juliaValue; 
    ptr[offset*4 + 1] = 0; 
    ptr[offset*4 + 2] = 0; 
    ptr[offset*4 + 3] = 255; 
} 

// globals needed by the update routine 
struct DataBlock { 
    unsigned char *dev_bitmap; 
}; 

int main(void) { 
    DataBlock data; 
    CPUBitmap bitmap(DIM, DIM, &data); 
    unsigned char *dev_bitmap; 

    HANDLE_ERROR(cudaMalloc((void**)&dev_bitmap, bitmap.image_size())); 
    data.dev_bitmap = dev_bitmap; 

    dim3 grid(DIM,DIM); 
    kernel<<<grid,1>>>(dev_bitmap); 

    HANDLE_ERROR(cudaMemcpy(bitmap.get_ptr(), dev_bitmap, 
           bitmap.image_size(), 
           cudaMemcpyDeviceToHost)); 

    HANDLE_ERROR(cudaFree(dev_bitmap)); 

    bitmap.display_and_exit(); 
} 

私のVisual Studioがしかし、それ以外の場合は、私が推測され、(それは私がジュリア機能で、後でそれを使用することはできませんと言われます)コンパイルされません、デバイスにcuComplexコンストラクタをembelishために私を強制的に十分です。だから私は持っている:

__device__ cuComplex(float a, float b) : r(a), i(b) {} 

をしかし、私はそれがcuda_runtime.hとdevice_launch_parameters.h、同様にglut32.dllをコピーであるVS、を介して実行するために必要なが含まれて追加した(例を実行したときに行いますexeと同じフォルダ)、すぐに失敗し、デバイスドライバが強制終了され、94行目の不明なエラーが発生したと言います。これはmainのcudaMemcpyコールです。正確には、それは "cudaDeviceToHost"という呼び出しを含む実際の行です。しかし、私はラインの後にいくつかのブレークポイントを作成しようとしましたが、ドライバはカーネルコールで死ぬでしょう。

誰かが間違っているかもしれないことを教えてください。私はCUDAのノブであり、なぜそのような自明な例がそれ自体を殺すのか、本当の考えを持っていません。私は何が間違っていますか?率直に言って、私は本当に何を調査すべきか分からない。 私はCUDA 4.1ツールキット、NSight 2.1、GeForce GT445Mのコンピューティング能力は2.1、ドライバのバージョンは295です。

+0

Visual C++のCUDAプロパティシートで計算機能2.0ターゲットを使用していることを確認しましたか? –

+0

いいえ、率直に言って私のプロジェクトプロパティページの "CUDA C/C++"セクションにこのような設定はありません。どこを見ますか? –

+0

"Device> Code Generation"の下で – Bart

答えて

2

私はこれをまだテストする時間がありませんでしたが、窓が関わっている限り、あなたのGFXが「タイムアウト」しているかもしれないと思います。

WindowsにはVistaからのデフォルト動作があり、gfxドライバに2秒後に回復するように指示します。あなたの仕事に時間がかかる場合、あなたは起動します。レジストリを使用してこの機能を増減することができます。私はちょうど変更を加えてまだ動作していないので、これを再起動する必要があると思います。 http://msdn.microsoft.com/en-us/windows/hardware/gg487368.aspx

...

タイムアウト検出と回復:Windows Vistaでは、これらの問題の ハング状況を検出し、動的応答デスクトップ を回復しようとし 詳細については、このリンクを参照してください。このプロセスでは、Windowsディスプレイドライバモデル(WDDM) ドライバが再初期化され、GPUがリセットされます。再起動は必要ありません。ユーザーエクスペリエンスを大幅に向上させる ハング検出から回復までの唯一の目に見えるアーチファクト は画面のちらつきです。 はグラフィックスタックの一部をリセットし、 の画面を再描画します。いくつかの古いMicrosoft DirectXアプリケーションは、この回復の最後に に黒い画面を表示することがあります。エンドユーザーは これらのアプリケーションを再起動する必要があります。 TDRプロセスの簡単な概要は以下の通りです:....

は明らかにこれはその奇妙なバグが、それはMEMはどのくらいの速に応じて、異なる人々のために異なるスケールでのエラーをコピーすることをお渡ししますので、理由は彼らgfxはです。

これはCUDAの既知の問題です。

+0

これは本当であることが判明しました。それをあきらめた後、私は次の日にもう少しデバッグを続け、問題は解決しました。人々はこの問題を十分に認識しておくべきです。 –

0

これを変更してみてください。 const float scale = 1.5;

と3.5,4.5,5.5のようなものがあります。

例: const float scale = 5.5;

関連する問題