如何实现kernal函数的同步操作

ExpandPixel2X2For8BitGrad_Kernel_2<<<BlockNum, ThreadNum>>>(Width, Height, 2, dev_ImageGrad, dev_ImageSrc, dev_ImageDes);

cudaFree(dev_ImageSrc);
cudaFree(dev_ImageGrad);

byte * ImagePolatation;
cudaMalloc(&ImagePolatation, LineByteOut * Height * 2);
Filter3X3_Kernal<<<BlockNum, ThreadNum>>>(dev_ImageDes, Width * 2, Height * 2, ImagePolatation);

我释放cudaFree(dev_ImageSrc);cudaFree(dev_ImageGrad);之后程序运行时不正确的,如何把cudaFree(dev_ImageSrc);cudaFree(dev_ImageGrad);放在Filter3X3_Kernal<<<BlockNum, ThreadNum>>>(dev_ImageDes, Width * 2, Height * 2, ImagePolatation);后面运行才正确,我想问一下
(1)这个是不是属于核函数之间的同步问题?
(2)若想使用完指针之后立即释放,应该如何操作?

楼主您好,您的代码序列:
<<<>>>(…, dev_ImageGrad, …, dev_ImagesDes);
然后
cudaFree(dev_ImageGrad);

cudaFree(dev_ImagesDes);

这样是不可以的。因为您极有可能正在或者即将开始运行kernel的时候,该kernel所使用的缓冲区就已经被释放了。这会导致问题的。

请在确保您的kernel完成后再释放它使用的资源。
如果需要这种确保,您可以通过使用cudaDeviceSynchronize()来同步一下。

多谢!加后再释放还是不行啊,

LZ您好,根据您1#的代码:
ExpandPixel2X2For8BitGrad_Kernel_2<<<BlockNum, ThreadNum>>>(Width, Height, 2, dev_ImageGrad, dev_ImageSrc, dev_ImageDes);

cudaFree(dev_ImageSrc);
cudaFree(dev_ImageGrad);

在kernel:“ExpandPixel2X2For8BitGrad_Kernel_2”之后,cudaFree(dev_ImageSrc);cudaFree(dev_ImageGrad);之前添加cudaDeviceSynchronize()函数应当可以保证kernel执行完之后才释放两段线性缓冲区,因而应该是无问题的。

如果您依然观察到问题,请提供更为详细的信息。

祝您好运~