在CUDA中初始化dim3变量,“dim3 dimGrid(numBlocks);”如何?语法工作?

时间:2013-10-08 12:54:40

标签: c++ syntax cuda initialization

我正在学习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编译器的特殊行为,但我找不到任何证实这一点的东西。

我是对的,这是正在发生的事情,还是还有其他一些我不明白这是如何工作的?

2 个答案:

答案 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不是一种类型,所以一切都很好。