2016-11-07 12 views
-1

は、私は私のコードではmalloc()とfree()を再定義したいが、私は実行すると、2つのエラーが表示されます。CUDAでmalloc/freeを再定義する方法は?

その後
allowing all exceptions is incompatible with previous function "malloc"; 
allowing all exceptions is incompatible with previous function "free"; 

私は、このエラーの検索が、私たちが再定義することはできませんCUDAですlibary関数、これは本当ですか?これらの関数を再定義できない場合、どのようにエラーを解決できますか?

+0

これらの関数のラッパーを作成するだけでは不十分だとすると、[this](http://stackoverflow.com/questions/262439/create-a-wrapper-function-for-malloc-and)を参照してください。 -free-in-c)の質問です。 – srodrb

+0

また、[this](http://codinggorilla.domemtech.com/?p=504)の記事では、cudaMallocのフックの実装方法について詳しく説明しています。 – srodrb

+2

これは基本的に以前の質問ですか? http://stackoverflow.com/questions/39565884/error-allowing-all-exceptions-is-incompatible-with-previous-function-malloc – talonmies

答えて

1

非常に短い答えはできないということです。

mallocは基本的に、CUDAツールチェーンが内部的にデバイスコードのデバイスフックでオーバーロードするC++標準ライブラリ関数です。 mallocまたはfreeという独自のデバイスバージョンを定義しようとすると、ツールチェーンの内部が壊れる可能性があります。正確にどのようにプラットフォームとコンパイラに依存します。

__device__ void* malloc(size_t) 
{ return theHeap.alloc(t); } 
__device__ void free(void* p) 
{ the Heap.dealloc(p); } 
ため、既存の標準ライブラリの要件の

mallocfreeは、グローバルな名前空間スコープで__device__ __host__のように定義する必要があります。この上のあなたの前の質問で

は、次のようなコードを持っていました。 CUDAでは、同じ機能の別々の__device____host__の定義を持つことは違法です。この制限を回避するには、カスタムアロケータのプライベートネームスペースを使用するか、別の関数名を使用します。しかし、デバイスやホストコード内の標準ライブラリから何かを再定義しようとしないでください。それは物事を壊すでしょう。

+0

なぜ、新しい定義と削除を再定義できますか? – shrimp

関連する問題