エラーは、モジュール ファイルが無効な場合にCUDA_ERROR_INVALID_IMAGE
のみ返されます。cuModuleLoad
見つからないか、アーキテクチャの不一致が含まれている場合は、CUDA_ERROR_FILE_NOT_FOUND
またはCUDA_ERROR_INVALID_SOURCE
エラーが表示されるはずです。何が起こっているのかを特定するのに十分な詳細やコードが提供されていませんが、原則として、少なくとも API コードは機能するはずです。
これがどのように機能するかを示すために、CUDA 5.5 を使用する Linux での次の動作例を検討してください。
最初にカーネル:
#include <cmath>
using namespace std;
__device__ __inline__ float trim(unsigned char value)
{
return fminf((unsigned char)255, fmaxf(value, (unsigned char)0));
}
__constant__ char z = 1;
__global__ void kernel(unsigned char* img, const float* a)
{
int ix = blockIdx.x;
int iy = threadIdx.x;
int tid = iy*blockDim.x + ix;
float x = (float)ix / blockDim.x;
float y = (float)iy / gridDim.x;
//placeholder
img[tid*4+0] = trim((a[0]*z*z+a[1]*z+a[2]) * 255.0f);
img[tid*4+1] = trim((a[3]*z*z+a[4]*z+a[5]) * 255.0f);
img[tid*4+2] = trim((a[6]*z*z+a[7]*z+a[8]) * 255.0f);
img[tid*4+3] = 255;
}
次に、実行時にcubinをコンテキストにロードする簡単なプログラム:
#include <cuda.h>
#include <string>
#include <iostream>
#define Errchk(ans) { DrvAssert((ans), __FILE__, __LINE__); }
inline void DrvAssert( CUresult code, const char *file, int line)
{
if (code != CUDA_SUCCESS) {
std::cout << "Error: " << code << " " << file << "@" << line << std::endl;
exit(code);
} else {
std::cout << "Success: " << file << "@" << line << std::endl;
}
}
int main(void)
{
Errchk( cuInit(0) );
CUdevice device;
Errchk( cuDeviceGet(&device, 0) );
CUcontext ctx;
Errchk( cuCtxCreate(&ctx, 0, device) );
CUmodule module;
std::string path = "qkernel.cubin";
Errchk( cuModuleLoad(&module, path.c_str()) );
cuCtxDetach(ctx);
return 0;
}
ホストに存在するデバイスのアーキテクチャ (この場合は GTX670) のキューブをビルドします。
$ nvcc -arch=sm_30 -Xptxas="-v" --cubin qkernel.cu
ptxas info : 11 bytes gmem, 1 bytes cmem[3]
ptxas info : Compiling entry function '_Z6kernelPhPKf' for 'sm_30'
ptxas info : Function properties for _Z6kernelPhPKf
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 10 registers, 336 bytes cmem[0]
およびホスト プログラム:
$ nvcc -o qexe qmain.cc -lcuda
次に実行します:
$ ./qexe
Success: qmain.cc@18
Success: qmain.cc@20
Success: qmain.cc@22
Success: qmain.cc@26
モジュール コードが読み込まれます。キュービンを削除して再度実行すると、次のように表示されます。
$ rm qkernel.cubin
$ ./qexe
Success: qmain.cc@18
Success: qmain.cc@20
Success: qmain.cc@22
Error: 301 qmain.cc@26
互換性のないアーキテクチャ用にコンパイルすると、次のように表示されます。
$ nvcc -arch=sm_10 -Xptxas="-v" --cubin qkernel.cu
ptxas info : 0 bytes gmem, 1 bytes cmem[0]
ptxas info : Compiling entry function '_Z6kernelPhPKf' for 'sm_10'
ptxas info : Used 5 registers, 32 bytes smem, 4 bytes cmem[1]
$ ./qexe
Success: qmain.cc@18
Success: qmain.cc@20
Success: qmain.cc@22
Error: 300 qmain.cc@26
cubin ではなくオブジェクト ファイルにコンパイルすると、次のように表示されます。
$ nvcc -arch=sm_30 -Xptxas="-v" -c -o qkernel.cubin qkernel.cu
ptxas info : 11 bytes gmem, 1 bytes cmem[3]
ptxas info : Compiling entry function '_Z6kernelPhPKf' for 'sm_30'
ptxas info : Function properties for _Z6kernelPhPKf
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 10 registers, 336 bytes cmem[0]
$ ./qexe
Success: qmain.cc@18
Success: qmain.cc@20
Success: qmain.cc@22
Error: 200 qmain.cc@26
CUDA_ERROR_INVALID_IMAGE
これは、コードでエラーを発生させる唯一の方法です。私が提案できるのは、私のコードとレシピを試して、それが機能するかどうかを確認することだけです.