要对很多张影像进行处理,对每张影像创建一个stream 是否可行?
LZ您好:
我大致翻看了一下手册,似乎没有提及最多能建立多少个stream,不知是否是我看漏了,这点请其他人补充。
我简单测试了一下,连续建立10000个stream是无问题的。[attach]3279[/attach]
以及,您这个实际上应该不成为问题,因为多stream的作用实际上是划分多个逻辑依赖链,不同依赖链之间的计算和传输是没有依赖关系的,因此可以互相掩盖。所以您完全可以在一个stream里面处理多张图像,这样使用较少的stream即可。
以及上面的简单测试中,连续建立多个stream也是需要一定时间开销的,这一点也请您在使用中加以权衡。
大致如此,未及之处,欢迎补充、指正。
祝您编码顺利~
建立了两个stream ,没想到速度还慢了些
LZ您好:
您1#的问题已经在2#给予回答。
您3#表示您使用了两个stream,然后速度有所降低。
我表示,这完全是您自己的代码实现造成的,或许和您的软硬件环境也有一定关系。但是这并不成为您怀疑stream机制的理由的。
大致如此,祝您好运~
我的代码思想是这样的,原来是一张一张读进内存进行处理,现在我想两张一起读进来进行处理,也许会快点,所以用两个stream.
代码大致如下:
for(int iband = 0 ;iband < nBands_1; iband++){
ors_byte* inbuf_1 = pImgData1->getBandBuf( iband );
ors_byte* inbuf_2 = pImgData2->getBandBuf( iband );
memset(outBuf_1, 0, npoolSize * sizeof(BYTE));
memset(outBuf_2, 0, npoolSize * sizeof(BYTE));
bool b_memcpy = dev_memcpySync( dev_inBuf_1, inbuf_1, n_inSize_1, stream_1,true );
b_memcpy = dev_memcpySync( dev_inBuf_2, inbuf_2, n_inSize_2, stream_2 ,true );
orthCorrection( dev_inBuf_1,dev_outBuf_1, nWid_1 ,nHei_1, wid_1, hei_1, dem_X0,
dem_Y0,dem_DX,dem_DY, dem_row,dem_col,p_dem_data,m_Boundary[n] ,bac_1, M,Xs_1,Ys_1,Zs_1,x0,y0,f ,stream_1);
orthCorrection( dev_inBuf_2,dev_outBuf_2, nWid_2 ,nHei_2, wid_2, hei_2, dem_X0,
dem_Y0,dem_DX,dem_DY, dem_row,dem_col,p_dem_data,m_Boundary[n + 1] ,bac_2, M,Xs_2,Ys_2,Zs_2,x0,y0,f ,stream_2);
b_memcpy = dev_memcpySync( outBuf_1, dev_outBuf_1, n_outSize_1,stream_1, false );
b_memcpy = dev_memcpySync( outBuf_2, dev_outBuf_2, n_outSize_2,stream_2, false );
cudaStreamSynchronize( stream_1 );
cudaStreamSynchronize( stream_2 );
outWriter_1->WriteBandRect( iband, 0, 0, wid_1, hei_1, outBuf_1);
outWriter_2->WriteBandRect( iband, 0, 0, wid_2, hei_2, outBuf_2);
}
stream 是在for 循环之外创建的,不知这样在for 循环里使用stream 是否是正确使用了stream?
LZ您好:
在循环外面建立stream是可以的,可以在循环内部正确使用。
但是您这里,只给了非常有限的一段代码,并且大量使用了您自己封装的函数,这样无法直接看出了。
一般地,需要host端的page-locked内存+异步版本的cudaMemcpy+没有其他指定同步或者隐含同步+telsa卡(geforce在部分版本驱动下不行)。
您可以参阅下手册的相关章节以及如下链接:
https://developer.nvidia.com/content/how-overlap-data-transfers-cuda-cc
大致如此,请您参考。
祝您编码顺利~