2017-11-01 12 views
1

NVIDIA Computing Toolkit(CUDA 9.0 SDKを含む)をダウンロードしました。 SDK内には、cppIntegrationというVisual Studioプロジェクトがあります。 cppIntegrationプロジェクトでcudaMallocを使用して割り当てられたメモリは `?? ?? ?

cudaMalloc()を使用してメモリを割り当てられ、その後、データはcudaMemcpy()を使用してこれらの変数にコピーされているタイプchar*の変数があります。 Visual Studioでプロジェクトをデバッグしているときに、char*変数が指し示すメモリアドレスがわかりますが、デバッガのメモリウィンドウを使用してそのメモリを読み込もうとすると、私はちょうど?? ?? ??と表示されます。

cppIntegrationプロジェクトで.cuファイルは(唯一の問題に関連するコードを示す)、次のとおりです。

extern "C" bool 
runTest(const int argc, const char **argv, char *data, int2 *data_int2, unsigned int len) 
{ 
    // use command-line specified CUDA device, otherwise use device with highest Gflops/s 
    findCudaDevice(argc, (const char **)argv); 

    const unsigned int num_threads = len/4; 
    assert(0 == (len % 4)); 
    const unsigned int mem_size = sizeof(char) * len; 
    const unsigned int mem_size_int2 = sizeof(int2) * len; 

    // allocate device memory 
    char *d_data; 
    checkCudaErrors(cudaMalloc((void **) &d_data, mem_size)); 
    // copy host memory to device 
    checkCudaErrors(cudaMemcpy(d_data, data, mem_size, 
           cudaMemcpyHostToDevice)); 
    ... 
    ... 
    ... 
} 

runTest()main()から呼び出されます。

d_dataが指すデータを表示しようとしましたが、?? ?? ??と表示されます。 char*が指す実際のメモリデータを表示するにはどうすればよいですか?

答えて

2

このメモリは、ホスト(= CPU)デバッガでは表示できません。 cudaMallocはデバイス(= GPU)メモリを割り当てるため、ポインタがGPUメモリにポイントし、ホスト上で何の意味も持ちません。ホストの観点からは、デバイスメモリポインタはブラックボックスの値に過ぎません。デバイスコードだけが逆参照することができます。

デバッグ時にデバイスメモリの内容を表示するには、デバイスデバッガ(NSightやcuda-gdbなど)を使用し、デバイスコードにブレークポイントを設定する必要があります。私はこれについての経験はないので、私はもっと情報を提供することはできません。

このようなメモリをホストで表示するには、ホストメモリにそのメモリをコピーする必要があります。それはcudaMemcpy(..., cudaMemcpyDeviceToHost)と同様の機能がするものです。

+0

デバッグの目的で、人々は通常、デバイスからホストにメモリをコピーして見せるのですか?私はこれをどのように達成するのかを含めてください。私は[this](http://developer.download.nvidia.com/NsightVisualStudio/3.0/Documentation/UserGuide/HTML/Content/View_Memory.htm)を読んでデバイスのメモリを見ることができると思ったが、読み込みしようとしているのがグローバルではなく、共有でもローカルでもないのですか? – db7638

+1

Nsight VSEのデバイスコードデバッグ機能を使用し、デバイスコードにブレークポイントを設定して(そのブレークポイントでヒット/ストップする)、その時点でデバイスデータを検査できるはずです。 –

+0

'cuda-gdb'を使うと'(@グローバルchar *)データ 'としてキャストすることでメモリにアクセスできます。この場合、Windowsプラットフォームからは役に立ちません – BAdhi

関連する問題