有没有办法动态确定cuda流的数量?

有没有办法动态确定cuda流的数量?,cuda,Cuda,有没有办法在程序执行期间而不是在编译时确定cuda流的数量?就像使用“new”命令一样。(流是指代码块,而不是线程) 编辑1 (回应最后的评论)说 for(int i=0;i

有没有办法在程序执行期间而不是在编译时确定cuda流的数量?就像使用“new”命令一样。(流是指代码块,而不是线程)

编辑1

(回应最后的评论)说

for(int i=0;i
如果我的理解是正确的,没有串行代码,内核应该并行执行


但是,如果串行代码可以由i并行化(即,如果取出,可以以OpenMP方式并行化),那么内核会并发执行吗。它会影响并发吗?

是的,流的数量可以在运行时确定

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_流;
// ... 在运行时设置num_流
cudastreams_t streams[num_streams];
对于(int i=0;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_流;
// ... 设置num_流
cudaStream_t*streams=(cudaStream_t*)malloc(num_streams*sizeof(cudaStream_t));
对于(int i=0;i
或:

int num_流;
// ... 设置num_流
cudaStream_t*streams=新的cudaStream_t[num_streams];
对于(int i=0;i
我刚刚尝试了“malloc”命令,该命令返回一个“cudaStream\u t”指针。代码可以编译,但感觉有点奇怪。将测试此操作是否正确运行..但是
这里有一个数组,不是吗?我认为必须在编译时指定元素的数量?尝试了您的代码,但它不会编译,除非使用一些代码,如
const int num_streams=2
;不,不需要在编译时指定元素的数量。上面的例子为我正确编译,没有
const
很好地检查,数组可以是C99中的动态大小。。谢谢顺便说一下,如果我的理解是正确的,for循环中的流将在编译后并行执行(如果有足够的资源)。但是,如果在循环中添加一些串行代码,会影响并行性吗?对循环变量
i
进行一些操作。假设串行代码仅依赖于
i
,即整个for循环在语义上仍然是并行的。
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]));