私は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を示しているため、必ず可能である必要があります。違いは、コードはテクスチャ参照用ですが、私はテクスチャオブジェクトが必要です。