nvcc如何处理内核中的const指针?
根据nvidia的说法,在参数传递期间为指针添加const和 restrict 使NVCC能够进行积极优化,这是否严格遵循C / C ++方式?
假设A指针指向数据缓冲区,该缓冲区可能被其他线程/流频繁更新,但在此测试内核调用期间内容不会被修改:
test<<<blocks, threads>>>(const int *__restrict__ A, int *__restrict__ B);
那么NVCC可以保持这种正确性:在每次内核调用时加载A中的更新数据,而不是加载一些预先缓存的过时数据吗?
答案 0 :(得分:5)
const
就像C ++一样。无法更改const
变量,编译器会在编译时检查此变量。编译器仅针对给定范围检查const-correctness,因为可以使用C样式转换来更改const。
restrict
以C方式工作。当您将指针标记为限制编译器时,假定这些指针没有别名。这是你的事实,编译器不会检查这个事实是否属实。
提出您的问题,NVCC无法确保全局内存写入和内核启动之间读取的正确性。由于内核启动在CUDA中是异步的,因此必须确保修改这些内存空间的内核不会同时执行。您可以通过同步内存副本和/或cudaDeviceSynchronize()
来实现此目的。如果同时启动这些内核,则在从其他内核访问之前,无法确保不同内核的所有更改都提交到全局内存。