イメージに対する論理操作用のテンプレート CUDA カーネルを定義しようとしています。コードは次のようになります。
#define AND 1
#define OR 2
#define XOR 3
#define SHL 4
#define SHR 5
template<typename T, int opcode>
__device__ inline T operation_lb(T a, T b)
{
switch(opcode)
{
case AND:
return a & b;
case OR:
return a | b;
case XOR:
return a ^ b;
case SHL:
return a << b;
case SHR:
return a >> b;
default:
return 0;
}
}
//Logical Operation With A Constant
template<typename T, int channels, int opcode>
__global__ void kernel_logical_constant(T* src, const T val, T* dst, int width, int height, int pitch)
{
const int xIndex = blockIdx.x * blockDim.x + threadIdx.x;
const int yIndex = blockIdx.y * blockDim.y + threadIdx.y;
if(xIndex >= width || yIndex >= height) return;
unsigned int tid = yIndex * pitch + (channels * xIndex);
#pragma unroll
for(int i=0; i<channels; i++)
dst[tid + i] = operation_lb<T,opcode>(src[tid + i],val);
}
問題は、ビット シフトのためにカーネルをインスタンス化すると、次のコンパイル エラーが発生することです。
エラー 1 エラー: エラーのため Ptx アセンブリが中止されました
カーネル インスタントは次のようになります。
template __global__ void kernel_logical_constant<unsigned char,1,SHL>(unsigned char*,unsigned char,unsigned char*,int,int,int);
unsigned char
、 、unsigned short
、 1 および 3 チャネルとすべての論理演算について、このようなインスタンスがさらに 19 あります。ただし、ビットシフトの瞬間のみ、つまりエラーが発生SHL
しSHR
ます。これらのインスタントを削除すると、コードはコンパイルされ、完全に機能します。operation_lb
ビットシフトをデバイス関数内の他の操作に置き換えても、コードは機能します。これは、カーネルの非常に多くの異なるインスタンスのために生成される ptx コードの量と関係があるのではないかと考えていました。
CUDA 5.5、Visual Studio 2010、Windows 8 x64 を使用しています。用にコンパイルしていcompute_1x, sm_1x
ます。
どんな助けでも大歓迎です。