4

我正在学习 CUDA,在大量示例代码中,我看到块和网格尺寸设置如下:

dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
exampleKernel<<<dimGrid, dimBlock>>>(input);

我知道像这样的行dim3 dimGrid(numBlocks);正在初始化 dim3 类型的变量 dimGridnumBlocks作为其 x 值 - 但我不确定这是如何工作的。

我只是假设它是普通的 C++ 语法,但对于 C++,我认为该行必须这样写:

dim3 dimGrid = dim3(numBlocks);

否则你会得到“最令人烦恼的解析”。所以我假设将这些行解释为变量赋值是 CUDA 的 NVCC 编译器的特殊行为,但我找不到任何可以证实这一点的东西。

我是对的,这就是正在发生的事情,还是我不明白这是如何工作的?

4

2 回答 2

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;
}

希望这可以帮助。

于 2013-10-08T13:00:17.627 回答
3

这是正常的 C++ 语法。如果括号为空或包含类型(后跟括号),您只会得到(最)令人烦恼的解析。在你的情况下,numBlocks不是一种类型,所以一切都很好。

于 2013-10-08T12:56:47.037 回答