我可以在同一个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);
}
如果没有,你会怎么做这样的事情?
答案 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常见问题解答)。