关于CUDA中的const指针和参数传递
About const pointer and parameter-passing in CUDA
nvcc如何处理内核中的const指针?
根据nvidia的说法,在参数传递期间为指针添加const和restrict使NVCC能够进行积极的优化,这是否严格遵循C/c++的方式?
假设A是指向数据缓冲区的指针,该缓冲区可能会被其他线程/流频繁更新,但在此测试内核调用期间内容不会被修改:
test<<<blocks, threads>>>(const int *__restrict__ A, int *__restrict__ B);
那么NVCC是否可以保持这种正确性:在每次内核调用时加载A中的更新数据,而不是加载一些预缓存的过时数据?
const
像c++一样工作。const
变量不能更改,编译器会在编译时检查这一点。编译器只检查给定范围的const正确性,因为const可以通过C风格强制转换改变。
restrict
以C方式工作。将指针标记为restrict时,编译器假定这些指针没有别名。这是你给定的事实,编译器不会检查这个事实是否为真。
回答你的问题,NVCC不会确保内核启动之间全局内存写和读的正确性。由于内核启动在CUDA中是异步的,您必须确保修改这些内存空间的内核不会同时执行。您可以通过同步内存拷贝和/或cudaDeviceSynchronize()
来实现这一点。如果同时启动这些内核,则无法确保不同内核的所有更改都在其他内核访问之前提交到全局内存。
相关文章:
- 使用指向成员的指针将成员函数作为参数传递
- 修改函数中的指针(将另一个指针作为参数传递)
- 将成员函数指针作为参数传递给模板方法
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 将函数指针数组中的函数指针作为模板参数传递
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 如何将指针变量作为引用参数传递?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- Qt5 - 如何将"QList<T> *"指针作为信号参数传递,并在完成后将其删除?
- C++将指向成员的指针作为模板参数传递
- 通过引用函数传递指针参数是什么意思?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 将函数指针作为函数参数传递的目的
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 使用 C++11 将指向成员函数的指针作为参数传递
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 在一行中将默认类型值上的指针作为参数传递
- 将双指针作为参数传递给需要引用 std::vector <double>的函数