cuda中内核的并行执行

cuda中内核的并行执行,cuda,parallel-processing,nvidia,Cuda,Parallel Processing,Nvidia,假设我有三个全局数组,它们已经使用cudaMemcpy复制到gpu中,但是c中的这些gloabl数组并没有使用cudaHostAlloc分配,以便分配页面锁定的内存,它们是简单的gloabl分配 int a[100],b [100],c[100]; cudaMemcpy(d_a,a,100*sizeof(int),cudaMemcpyHostToDevice); cudaMemcpy(d_b,b,100*sizeof(int),cudaMemcpyHostToDevice); cudaMemcp

假设我有三个全局数组,它们已经使用cudaMemcpy复制到gpu中,但是c中的这些gloabl数组并没有使用cudaHostAlloc分配,以便分配页面锁定的内存,它们是简单的gloabl分配

int a[100],b [100],c[100];
cudaMemcpy(d_a,a,100*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(d_b,b,100*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(d_c,c,100*sizeof(int),cudaMemcpyHostToDevice);
现在我有10个内核,它们以不同的流启动,以便并行运行,其中一些使用gpu中复制的全局数组。 现在这些内核运行了1000次迭代。 在迭代过程中,他们不必将任何内容复制回主机

但问题是它们不是并行执行,而是以串行方式执行

  cudaStream_t stream[3];

   for(int i=0;i<3;i++)cudaStreamCreate (&stream[i]);

   for(int i=0;i<100;i++){
       kernel1<<<blocks,threads,0,stream[0]>>>(d_a,d_b);
       kernel2<<<blocks,threads,0,strea[1]>>(d_b,d_c);
      kernal3<<<blocks,threads,0,stream[2]>>>(d_c,d_a);
    cudaDeviceSynchronize();
  }
cudaStream\u t stream[3];

对于以这种方式发布的(int i=0;i内核:

   for(int i=0;i<100;i++){
    kernel1<<<blocks,threads>>>(d_a,d_b);
    kernel2<<<blocks,threads>>>(d_b,d_c);
    kernal3<<<blocks,threads>>>(d_c,d_a);
    cudaDeviceSynchronize();
  }

for(int i=0;isorry表示我实际按照您指定的方式编写的问题中的拼写错误,但没有相应地起作用。我已在问题中进行了必要的更正您显示的代码仍然无效。您有
stream[i]
stream1
这些将永远不会是相同的。无论如何,您可能需要提供一个完整的。并查看文档以发现并发内核的所有要求。您是否尝试运行concurrentKernels示例?我同意robert的观点,您的内核必须使用有限的资源。如果您使用cuda 7.0,也许您可以告诉我们创建新的每线程默认流。
   cudaStream_t stream1, stream2, stream3;
   cudaStreamCreate(&stream1); cudaStreamCreate(&stream2); cudaStreamCreate(&stream3);

   for(int i=0;i<100;i++){
    kernel1<<<blocks,threads,0,stream1>>>(d_a,d_b);
    kernel2<<<blocks,threads,0,stream2>>>(d_b,d_c);
    kernal3<<<blocks,threads,0,stream3>>>(d_c,d_a);
    cudaDeviceSynchronize();
  }