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

相关文章

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于