nppiYUV420ToRGB_8u_P3C3R这个函数怎么用

NppStatus nppiYUV420ToRGB_8u_P3C3R (const Npp8u ∗const pSrc[3], int rSrcStep[3], Npp8u ∗ pDst, int nDstStep, NppiSize oSizeROI)
这个函数的第一个参数怎么传参?我定义一个: Npp8u m_src_devicemem2[3],想把m_src_devicemem2传到第一个参数里,怎么传?
我对m_src_devicemem2这个指针数据这样赋值对吗?
cudaMalloc((void
*)&m_src_devicemem2[0],pDstYUV.size2/3);
cudaMalloc((void**)&m_src_devicemem2[1],pDstYUV.size
1/6);
cudaMalloc((void**)&m_src_devicemem2[2],pDstYUV.size1/6);
cudaMemcpy(m_src_devicemem2,(void
)pDstYUV->imageData,pDstYUV->imageSize/2,cudaMemcpyHostToDevice);
其中pDstYUV是planar的YUV buffer。
恳求各位回答,谢谢了

LZ您好:

1:您的第一个函数目测与本版范围无关,已自动无视。

2:您没有提供m_src_devicemem2的详情,但给出了4行使用cudaRunTime API的代码,大致推断如下:
m_src_devicemem2是一个指针数组,类型不明,大小不明但不应少于3个元素。
m_src_devicemem2应该存储于host端,否则3个cudaMalloc会挂掉。
但此时,cudaMemcpy()会挂掉,参数错误。如若m_src_devicemem2是指向device 端的global memory,那么cudaMemcpy()参数可能正确,但是前面的cudaMalloc()就必定会挂掉。

所以您的写法成功地构成了一个两难推断。

大致如此,祝您调试顺利~

1:我这个是用NPP函数库实现YUV和RGB之间的相互转换,也是CUDA的范围啊
2:m_src_devicemem2我定义的NPP8u *,就是unsigned char *,Npp是自己定义的
3:我连续三个cudaMalloc函数为什么会挂掉啊?不明白啊

LZ您好:

1:请您参阅NPP library的相关手册以确定该函数的参数类型以及参数传递的其他相关信息。我无法对该库内容予以建议。

2:您Npp8u *m_src_devicemem2[3]的定义出现在1#正文第三行,该行是叙述前面的函数参数传递问题的。该函数的传参注意事项请查阅官方手册。

以及,您未给出这个数组自身定义于host端还是device端。
cuda Runtime API的函数要求其参数自身必须存储于host端,此时,假定m_src_devicemem2[3]是定义在host端的指针数组,那么那么3个cudaMalloc()的参数类型是正确的,但同时数组名m_src_devicemem2指向的是host端的地址,您用在cudaMemcpy()函数中表示目的地的参数位置,并指定类型为cudaMemcpyHostToDevice,此时要求该指针指向device端地址,这就矛盾了。

反之,如果m_src_devicemem2[3]在device端,那么cudaMalloc()中用作参数的该数组元素并不满足“保存在host端”的要求,cudaMalloc()参数将不正确,无法正常执行。

因此,按照您这4行代码的写法,总会有一部分无法正确执行,这是谓之两难推断。

大致如此,欢迎您周末夜间来访。

祝您好运~