2016-12-16 20 views
1

私はCUDA初心者ではありません。私は、レーダデータ(2D)を処理するCUDAメソッドをいくつか作成しました。私は、CUDAプログラミングガイド、CUDA By Example、そして多くの記事を読んできました。(ありがとう、stackoverflow contributors)(How To?)短い(16ビット)テクスチャオブジェクトのCUDA線形補間

私は主にピッチリニアメモリを使用しています。私は最近テクスチャに入り、スピードアップを楽しんだ。

私の質問は:どのようにcudaFilterModeLinearは、符号付き16ビット短絡に基づいてテクスチャオブジェクトを扱うことができますか?

最小限の再現性のコード:

#include <helper_cuda.h> // checkCudaErrors 

int main(int argc, char * argv[]){ 

const unsigned int Nr = 4096; 
const unsigned int Na = 1024; 

void * ptr; 
size_t pitch; 
const size_t width = Nr*sizeof(short); 
const size_t height = Na; 

checkCudaErrors(cudaMallocPitch(&ptr, &pitch, width, height)); 

struct cudaResourceDesc resDesc; 
struct cudaTextureDesc texDesc; 
cudaTextureObject_t FrameTex; 

memset(&resDesc, 0, sizeof(resDesc)); 
resDesc.resType = cudaResourceTypePitch2D; 
//resDesc.res.pitch2D.desc = cudaCreateChannelDesc<float>(); 
resDesc.res.pitch2D.desc = cudaCreateChannelDesc<short>(); 

resDesc.res.pitch2D.devPtr  = ptr; 
resDesc.res.pitch2D.pitchInBytes = pitch; 
resDesc.res.pitch2D.width  = width; 
resDesc.res.pitch2D.height  = height; 

// Specify texture object parameters 
memset(&texDesc, 0, sizeof(texDesc)); 
texDesc.addressMode[0] = cudaAddressModeClamp; 
texDesc.addressMode[1] = cudaAddressModeClamp; 
// filter modes: Point, Linear 
texDesc.filterMode  = cudaFilterModeLinear; 
// read modes: NormalizedFloat, ElementType 
texDesc.readMode  = cudaReadModeElementType; 
texDesc.normalizedCoords = 0; 

// Create texture object 
checkCudaErrors(cudaCreateTextureObject(&FrameTex, &resDesc, &texDesc, NULL)); 

cudaDeviceReset(); 
return 0; 
} 

これは

CUDA error at ... code=26(cudaErrorInvalidFilterSetting) "cudaCreateTextureObject(&FrameTex, &resDesc, &texDesc, NULL)" 

CUDA Programming Guide v8.0の42が言うページの一番下をスローします「リニアテクスチャフィルタリングは、リターンするように構成されているテクスチャにのみ行うことができます浮動小数点データです。

戻り値が浮動小数点の場合は問題ありません。しかし、どのように16ビットの短い上のテクスチャのベースですか?

This postは、ucharを使用してcudaFilterModeLinearを示しているため、必ず可能である必要があります。違いは、コードはテクスチャ参照用ですが、私はテクスチャオブジェクトが必要です。

答えて

1

This postが答えます。

投稿を検索してもすぐには分かりませんでしたが、問題のタイトルがインテグラルテクセルタイプに関連していることを示していないためです。

具体的には、テクセルが整数型の場合、cudaReadModeNormalizedFloat は、をcudaFilterModeLinearと組み合わせて使用​​する必要があります。これは、「プログラミングガイド」の「浮動小数点データを返すように設定されている」という暗黙の意味です。さて、なぜNvidiaは明示的にそれを述べることができないのですか?

AFAIK addressModeまたはnormalizedCoords列挙型に依存しません。

編集:cudaReadModeNormalizedFloatはint32テクセルでは機能しません。より一般的には、int32のハードウェア補間はありません。