Learn CUDA Programming第二章 scaling image例子报错 invalid argument

本文主要是介绍Learn CUDA Programming第二章 scaling image例子报错 invalid argument,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从Learn CUDA programming 的GitHub网站下载的例子在我的Ubuntu上运行会出现错误

Example Code如下:

#include<stdio.h>
#include"scrImagePgmPpmPackage.h"//Kernel which calculate the resized image
__global__ void createResizedImage(unsigned char *imageScaledData, int scaled_width, float scale_factor, cudaTextureObject_t texObj)
{const unsigned int tidX = blockIdx.x*blockDim.x + threadIdx.x;const unsigned int tidY = blockIdx.y*blockDim.y + threadIdx.y;const unsigned index = tidY*scaled_width+tidX;// Step 4: Read the texture memory from your texture reference in CUDA KernelimageScaledData[index] = tex2D<unsigned char>(texObj,(float)(tidX*scale_factor),(float)(tidY*scale_factor));
}int main(int argc, char*argv[])
{int height=0, width =0, scaled_height=0,scaled_width=0;//Define the scaling ratio	float scaling_ratio=0.5;unsigned char*data;unsigned char*scaled_data,*d_scaled_data;char inputStr[1024] = {"aerosmith-double.pgm"};char outputStr[1024] = {"aerosmith-double-scaled.pgm"};cudaError_t returnValue;//Create a channel Description to be used while linking to the tecturecudaArray* cu_array;cudaChannelFormatKind kind = cudaChannelFormatKindUnsigned;cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(8, 0, 0, 0, kind);get_PgmPpmParams(inputStr, &height, &width);	//getting height and width of the current imagedata = (unsigned char*)malloc(height*width*sizeof(unsigned char));printf("\n Reading image width height and width [%d][%d]", height, width);scr_read_pgm( inputStr , data, height, width );//loading an image to "inputimage"scaled_height = (int)(height*scaling_ratio);scaled_width = (int)(width*scaling_ratio);scaled_data = (unsigned char*)malloc(scaled_height*scaled_width*sizeof(unsigned char));printf("\n scaled image width height and width [%d][%d]", scaled_height, scaled_width);//Allocate CUDA ArrayreturnValue = cudaMallocArray( &cu_array, &channelDesc, width, height);returnValue = (cudaError_t)(returnValue | cudaMemcpy( cu_array, data, height * width * sizeof(unsigned char), cudaMemcpyHostToDevice));if(returnValue != cudaSuccess)printf("\n Got error while running CUDA API Array Copy");// Step 1. Specify texturestruct cudaResourceDesc resDesc;memset(&resDesc, 0, sizeof(resDesc));resDesc.resType = cudaResourceTypeArray;resDesc.res.array.array = cu_array;// Step 2. Specify texture object parametersstruct cudaTextureDesc texDesc;memset(&texDesc, 0, sizeof(texDesc));texDesc.addressMode[0] = cudaAddressModeClamp;texDesc.addressMode[1] = cudaAddressModeClamp;texDesc.filterMode = cudaFilterModePoint;texDesc.readMode = cudaReadModeElementType;texDesc.normalizedCoords = 0;// Step 3: Create texture objectcudaTextureObject_t texObj = 0;cudaCreateTextureObject(&texObj, &resDesc, &texDesc, NULL);if(returnValue != cudaSuccess) printf("\n Got error while running CUDA API Bind Texture");cudaMalloc(&d_scaled_data, scaled_height*scaled_width*sizeof(unsigned char) );dim3 dimBlock(32, 32,1);dim3 dimGrid(scaled_width/dimBlock.x,scaled_height/dimBlock.y,1);printf("\n Launching grid with blocks [%d][%d] ", dimGrid.x,dimGrid.y);createResizedImage<<<dimGrid, dimBlock>>>(d_scaled_data,scaled_width,1/scaling_ratio, texObj);returnValue = (cudaError_t)(returnValue | cudaDeviceSynchronize());returnValue = (cudaError_t)(returnValue |cudaMemcpy (scaled_data , d_scaled_data, scaled_height*scaled_width*sizeof(unsigned char), cudaMemcpyDeviceToHost ));if(returnValue != cudaSuccess) printf("\n Got error while running CUDA API kernel");// Step 5: Destroy texture objectcudaDestroyTextureObject(texObj);scr_write_pgm( outputStr, scaled_data, scaled_height, scaled_width, "####" ); //storing the image with the detectionsif(data != NULL)free(data);if(cu_array !=NULL)cudaFreeArray(cu_array);if(scaled_data != NULL)free(scaled_data);if(d_scaled_data!=NULL)cudaFree(d_scaled_data);return 0;
}

根据cudaGetErrorString(returnValue) 的输出来看,错误定位到这两句

returnValue = cudaMemcpy( cu_array, data, height * width * sizeof(unsigned char), cudaMemcpyHostToDevice)

cudaCreateTextureObject(&texObj, &resDesc, &texDesc, NULL);

很明显是上一条语句的失败导致创建纹理对象失败

一开始还怀疑是不是作者读pgm的接口有问题,换成呗被图形学验证过无数次的stb_image这个库后还是报这两句错。

于是我开始怀疑CUDA API是否随着版本更新有变化,毕竟作者完成这本书是用的CUDA 10.x开发环境,而我的CUDA版本已经是12.0了。

最后发现cudaArray这个类型在新版本中从Host端复制到Device端需要使用cudaMemcpy2DToArray这个接口

重新编译

nvcc -c image_scaling.cu

nvcc -o image_scaling image_scaling.o scrImagePgmPpmPackage.o

发现已经不报错并且生成了缩放后的图片

不过我的代码是由stb_image读取的,所以在读取图片后CPU传给GPU前它的数据就是上下翻转的,因此GPU做完Kernel运算后缩放的图片转存后的图片也是上下翻转的。

这篇关于Learn CUDA Programming第二章 scaling image例子报错 invalid argument的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824247

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

Python报错ModuleNotFoundError的10种解决方案

《Python报错ModuleNotFoundError的10种解决方案》在Python开发中,ModuleNotFoundError是最常见的运行时错误之一,通常由模块路径配置错误、依赖缺失或命名冲... 目录一、常见错误场景与原因分析二、10种解决方案与代码示例1. 检查并安装缺失模块2. 动态添加模块

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二: