1

イメージに対する論理操作用のテンプレート 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 あります。ただし、ビットシフトの瞬間のみ、つまりエラーが発生SHLSHRます。これらのインスタントを削除すると、コードはコンパイルされ、完全に機能します。operation_lbビットシフトをデバイス関数内の他の操作に置き換えても、コードは機能します。これは、カーネルの非常に多くの異なるインスタンスのために生成される ptx コードの量と関係があるのではないかと考えていました。

CUDA 5.5、Visual Studio 2010、Windows 8 x64 を使用しています。用にコンパイルしていcompute_1x, sm_1xます。

どんな助けでも大歓迎です。

4

1 に答える 1