可以说我有三个全局数组,这些全局数组已使用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);
Run Code Online (Sandbox Code Playgroud)
现在我有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();
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么?