2012-03-01 15 views
3

私はCudaホスト機能を2回呼び出すCプログラムを実行しています。私はこれらの2つの呼び出しの間にデバイスメモリをクリーンアップしたいと思います。私はGPUデバイスのメモリをフラッシュする方法はありますか?私はテスラM2050のコンピューティング能力が2.0になっていますデバイスメモリflush cuda

+0

"フラッシュ"または "クリーンアップ"の意味を少し正確にすることはできますか?メモリをゼロにするか、それとも他の既知の初期化されていない値に設定することを意味しますか、それとも別の意味ですか?あなたが割り当てたメモリだけを "フラッシュ"したいのですか、それともデバイス全体を意味していますか? – talonmies

+0

私は、割り当てられたメモリをゼロにして、さまざまなカーネルによってそこに保存されていた値を "忘れる"ことを望んでいます。質問の漠然としたことを申し訳ありません。 – chemeng

答えて

4

メモリをゼロにしたい場合は、おそらくcudaMemsetがこれを行う最も簡単な方法でしょう。たとえば、次の値cudaMemsetがかかること

const int n = 10000000; 
const int sz = sizeof(float) * n; 
float *devicemem; 
cudaMalloc((void **)&devicemem, sz); 

kernel<<<...>>>(devicemem,....); 
cudaMemset(devicemem, 0, sz); // zeros all the bytes in devicemem 
kernel<<<...>>>(devicemem,....); 

バイト値であり、指定された範囲内のすべてのバイトは、単に標準C memsetように、その値に設定されています。特定のワードの値がある場合は、独自のmemsetカーネルを作成して値を割り当てる必要があります。

+1

16ビット値と32ビット値をmemsetするには、ドライバAPIの関数cuMemset *を呼び出すことができます。 CUDAランタイムアプリケーションからも、cuMemsetD16()またはcuMemsetD32() – ArchaeaSoftware

+0

@talonmies:CUDAの皆さんのご協力ありがとうございます。直接私に連絡することができます(最初の姓私の会社ドットコムで)?あなたに質問があります(申し訳ありませんが、SOは私的なメッセージをサポートしていません)。 – harrism

1

スラストベクトルを使用している場合は、リセットするベクトルでthrust::fill()を呼び出すことができます。

thrust::device_vector<FooType> fooVec(FooSize); 
kernelCall1<<< x, y >>>(/* Pass fooVec here */); 

// Reset memory of fooVec 
thrust::fill(fooVec.begin(), fooVec.end(), FooDefaultValue); 

kernelCall2<<< x, y >>>(/* Pass fooVec here */); 
関連する問題