有没有办法在程序执行期间而不是在编译时确定cuda流的数量?就像使用“新”命令一样。 (“流”是指代码块,而不是线程)
编辑1
(回复最后评论)说
for(int i = 0; i < nstreams; ++i)
(Some serial code here, not related to kernel or cuda memory copy);
someKernel<<<xx, yy, 0, stream[i]>>>(param list);
end
如果没有串行代码,如果我的理解正确,内核应该并行执行?
但是,如果串行代码可以由i并行化(即,如果取出则可以以OpenMP方式并行化),则内核是否会并发执行。它会影响并发吗?
答案 0 :(得分:2)
是的,可以在运行时确定流的数量。
int num_streams;
// ... set num_streams at runtime
cudaStream_t streams[num_streams];
for (int i = 0; i < num_streams; i++)
cudaStreamCreate(&(streams[i]));
以下结构也有效:
int num_streams;
// ... set num_streams
cudaStream_t *streams = (cudaStream_t *)malloc(num_streams*sizeof(cudaStream_t));
for (int i = 0; i < num_streams; i++)
cudaStreamCreate(&(streams[i]));
或:
int num_streams;
// ... set num_streams
cudaStream_t *streams = new cudaStream_t[num_streams];
for (int i = 0; i < num_streams; i++)
cudaStreamCreate(&(streams[i]));