同一个CUDA源文件中的多个全局函数

时间:2016-12-08 16:43:08

标签: cuda

我可以在同一个CUDA源文件中编写两个单独的全局函数来计算不同的东西吗?像这样:

__global__ void Ker1(mpz_t *d,mpz_t *c,mpz_t e,mpz_t n )
{
    int i=blockIdx.x*blockDim.x + threadIdx.x;

    mpz_powm (d[i], c[i], e, n);

}

__global__ void Ker2(mpz_t *d,mpz_t *c,mpz_t d, mpz_t n)
{
    int i=blockIdx.x*blockDim.x + threadIdx.x;
    mpz_powm(c[i], d[i],d, n);

}


int main()
{
    /* ... */
    cudaMemcpy(decode_device,decode_buffer,memSize,cudaMemcpyHostToDevice);
    Ker1<<<dimGrid , dimBlock >>>( d_device,c_device,e,n );
    Ker2<<<dimGrid , dimBlock>>>(c_device,d_device,d,n);
    cudaMemcpy(decode_buffer,decode_device,memSize,cudaMemcpyDeviceToHost);
}

如果没有,你会怎么做这样的事情?

1 个答案:

答案 0 :(得分:1)

目前还不清楚你在问什么,但在3次阅读之后,我假设:“我可以在同一个源文件中写几个内核吗?”。 您可以在主函数中编写尽可能多的内核启动。

第9页的示例:

...
cudaMemcpy( dev1, host1, size, H2D ) ;
kernel2 <<< grid, block, 0 >>> ( ..., dev2, ...  ) ;
kernel3 <<< grid, block, 0 >>> ( ..., dev3, ...  ) ;
cudaMemcpy( host4, dev4, size, D2H ) ;
...

来自:Streams and concurrency webinar

默认情况下,调用将是异步的,因此只要内核在GPU中启动,CPU就会处理后面的指令。 要强制同步,您必须使用 cudaDeviceSynchronize(),或通过cudaMemcpy进行任何强制同步的内存传输。

来源:CUDA FAQ

  问:CPU和GPU可以并行运行吗?   CUDA中的内核调用是异步的,因此驱动程序会在启动内核后立即将控制权返回给应用程序。

     

测量时应使用“cudaThreadSynchronize()”API调用   性能确保所有设备操作都已完成   停止计时器。

     

执行内存复制和控制图形的CUDA函数   互操作性是同步的,并且隐式地等待所有内核   完成。

顺便说一下,如果您不需要在内核之间进行同步,那么如果您的GPU具有所需的计算能力(CC),它们可以同时执行:

  问:是否可以同时执行多个内核?   是。计算能力2.x或更高的GPU支持并发内核执行和启动。

(仍然来自CUDA常见问题解答)。