CUDA 未知错误
CUDA unknown error
我正在尝试 运行 mainSift.cpp
来自 CudaSift on a Nvidia Tesla M2090. First of all, as explained in this 的问题,我不得不从 sm_35
更改为 sm_20
CMakeLists.txt
.
不幸的是现在返回了这个错误:
checkMsg() CUDA error: LaplaceMulti() execution failed
in file </ghome/rzhengac/Downloads/CudaSift/cudaSiftH.cu>, line 318 : unknown error.
这是 LaplaceMulti
代码:
double LaplaceMulti(cudaTextureObject_t texObj, CudaImage *results, float baseBlur, float diffScale, float initBlur)
{
float kernel[12*16];
float scale = baseBlur;
for (int i=0;i<NUM_SCALES+3;i++) {
float kernelSum = 0.0f;
float var = scale*scale - initBlur*initBlur;
for (int j=-LAPLACE_R;j<=LAPLACE_R;j++) {
kernel[16*i+j+LAPLACE_R] = (float)expf(-(double)j*j/2.0/var);
kernelSum += kernel[16*i+j+LAPLACE_R];
}
for (int j=-LAPLACE_R;j<=LAPLACE_R;j++)
kernel[16*i+j+LAPLACE_R] /= kernelSum;
scale *= diffScale;
}
safeCall(cudaMemcpyToSymbol(d_Kernel2, kernel, 12*16*sizeof(float)));
int width = results[0].width;
int pitch = results[0].pitch;
int height = results[0].height;
dim3 blocks(iDivUp(width+2*LAPLACE_R, LAPLACE_W), height);
dim3 threads(LAPLACE_W+2*LAPLACE_R, LAPLACE_S);
LaplaceMulti<<<blocks, threads>>>(texObj, results[0].d_data, width, pitch, height);
checkMsg("LaplaceMulti() execution failed\n");
return 0.0;
}
我已经读过 this 看起来有点相似的问题,但我不明白解决方案的含义或如何使用它来解决我的问题。
为什么会出现错误?
发生错误是因为您的 运行 代码具有您的 GPU(纹理对象)不支持的功能。我有点惊讶编译器在编译过程中没有产生错误,但这是另一个问题。
除了使用支持的硬件,或者重写代码,没有其他解决办法。
[此答案由评论组成并添加为社区 wiki 条目,以便将此答案从 CUDA 标签的未答复列表中删除]
我正在尝试 运行 mainSift.cpp
来自 CudaSift on a Nvidia Tesla M2090. First of all, as explained in this 的问题,我不得不从 sm_35
更改为 sm_20
CMakeLists.txt
.
不幸的是现在返回了这个错误:
checkMsg() CUDA error: LaplaceMulti() execution failed
in file </ghome/rzhengac/Downloads/CudaSift/cudaSiftH.cu>, line 318 : unknown error.
这是 LaplaceMulti
代码:
double LaplaceMulti(cudaTextureObject_t texObj, CudaImage *results, float baseBlur, float diffScale, float initBlur)
{
float kernel[12*16];
float scale = baseBlur;
for (int i=0;i<NUM_SCALES+3;i++) {
float kernelSum = 0.0f;
float var = scale*scale - initBlur*initBlur;
for (int j=-LAPLACE_R;j<=LAPLACE_R;j++) {
kernel[16*i+j+LAPLACE_R] = (float)expf(-(double)j*j/2.0/var);
kernelSum += kernel[16*i+j+LAPLACE_R];
}
for (int j=-LAPLACE_R;j<=LAPLACE_R;j++)
kernel[16*i+j+LAPLACE_R] /= kernelSum;
scale *= diffScale;
}
safeCall(cudaMemcpyToSymbol(d_Kernel2, kernel, 12*16*sizeof(float)));
int width = results[0].width;
int pitch = results[0].pitch;
int height = results[0].height;
dim3 blocks(iDivUp(width+2*LAPLACE_R, LAPLACE_W), height);
dim3 threads(LAPLACE_W+2*LAPLACE_R, LAPLACE_S);
LaplaceMulti<<<blocks, threads>>>(texObj, results[0].d_data, width, pitch, height);
checkMsg("LaplaceMulti() execution failed\n");
return 0.0;
}
我已经读过 this 看起来有点相似的问题,但我不明白解决方案的含义或如何使用它来解决我的问题。
为什么会出现错误?
发生错误是因为您的 运行 代码具有您的 GPU(纹理对象)不支持的功能。我有点惊讶编译器在编译过程中没有产生错误,但这是另一个问题。
除了使用支持的硬件,或者重写代码,没有其他解决办法。
[此答案由评论组成并添加为社区 wiki 条目,以便将此答案从 CUDA 标签的未答复列表中删除]