我正在学习CUDA,在大量示例代码中,我看到块和网格尺寸设置如下:
dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
exampleKernel<<<dimGrid, dimBlock>>>(input);
我理解像dim3 dimGrid(numBlocks);
之类的行正在初始化dimGrid(dim3类型的变量),以numBlocks
作为x值 - 但我不确定这是如何工作的。
我原本假设它是正常的C ++语法,但对于C ++,我认为该行必须像这样编写:
dim3 dimGrid = dim3(numBlocks);
否则你会得到“最令人烦恼的解析”。所以我假设这些行作为变量赋值的解释是CUDA的NVCC编译器的特殊行为,但我找不到任何证实这一点的东西。
我是对的,这是正在发生的事情,还是还有其他一些我不明白这是如何工作的?
答案 0 :(得分:5)
这是正常的C ++语法,您可以使用最小的工作示例自己尝试。
#include <iostream>
using namespace std;
class A {
int _x;
public:
A(int x) : _x(x) {}
int x() const { return _x; }
};
int main() {
A first(3);
cout << first.x() << endl; // "3"
return 0;
}
希望这有帮助。
答案 1 :(得分:3)
这是正常的C ++语法。如果括号为空或包含类型(后跟括号),则只能得到(最)令人烦恼的解析。在您的情况下,numBlocks
不是一种类型,所以一切都很好。