【发布时间】:2019-04-29 21:37:42
【问题描述】:
我刚刚在 CUDA 中学习了流技术,我尝试了一下。但是返回不希望的结果,即流不是并行的。 (在 GPU Tesla M6 上,操作系统 Red Hat Enterprise Linux 8)
我有一个大小为 (5,2048) 的数据矩阵,以及一个用于处理该矩阵的内核。
我的计划是分解“nStreams=4”扇区中的数据,并使用 4 个流来并行内核执行。
我的部分代码如下:
int rows = 5;
int cols = 2048;
int blockSize = 32;
int gridSize = (rows*cols) / blockSize;
dim3 block(blockSize);
dim3 grid(gridSize);
int nStreams = 4; // preparation for streams
cudaStream_t *streams = (cudaStream_t *)malloc(nStreams * sizeof(cudaStream_t));
for(int ii=0;ii<nStreams;ii++){
checkCudaErrors(cudaStreamCreate(&streams[ii]));
}
int streamSize = rows * cols / nStreams;
dim3 streamGrid = streamSize/blockSize;
for(int jj=0;jj<nStreams;jj++){
int offset = jj * streamSize;
Mykernel<<<streamGrid,block,0,streams[jj]>>>(&d_Data[offset],streamSize);
} // d_Data is the matrix on gpu
Visual Profiler 结果显示 4 个不同的流不并行。流 13 是第一个工作的,流 16 是最后一个工作的。流 13 和流 14 之间有 12.378us。每个内核执行持续大约 5us。在上面的“Runtime API”行中,它显示“cudaLaunch”。
你能给我一些建议吗?谢谢!
(我不知道stackoverflow如何上传图片,所以我只用文字描述结果。)
【问题讨论】: