关于CUDA中的const指针和参数传递

时间:2013-04-15 20:59:50

标签: c++ c cuda nvidia

nvcc如何处理内核中的const指针?

根据nvidia的说法,在参数传递期间为指针添加const和 restrict 使NVCC能够进行积极优化,这是否严格遵循C / C ++方式?

假设A指针指向数据缓冲区,该缓冲区可能被其他线程/流频繁更新,但在此测试内核调用期间内容不会被修改:

test<<<blocks, threads>>>(const int *__restrict__ A, int *__restrict__ B);

那么NVCC可以保持这种正确性:在每次内核调用时加载A中的更新数据,而不是加载一些预先缓存的过时数据吗?

1 个答案:

答案 0 :(得分:5)

const就像C ++一样。无法更改const变量,编译器会在编译时检查此变量。编译器仅针对给定范围检查const-correctness,因为可以使用C样式转换来更改const。

restrict以C方式工作。当您将指针标记为限制编译器时,假定这些指针没有别名。这是你的事实,编译器不会检查这个事实是否属实。

提出您的问题,NVCC无法确保全局内存写入和内核启动之间读取的正确性。由于内核启动在CUDA中是异步的,因此必须确保修改这些内存空间的内核不会同时执行。您可以通过同步内存副本和/或cudaDeviceSynchronize()来实现此目的。如果同时启动这些内核,则在从其他内核访问之前,无法确保不同内核的所有更改都提交到全局内存。