繁体   English   中英

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

[英]About const pointer and parameter-passing in CUDA

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

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

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

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

然后,NVCC是否可以保持此正确性:在每次内核调用时将更新的数据加载到A中,而不是加载一些预先缓存的过时数据?

const工作方式类似于C ++。 不能更改const变量,并且编译器会在编译时对其进行检查。 编译器仅检查给定范围的const正确性,因为constness可以使用C样式强制转换进行更改。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM