0

是否可以动态确定每个块的最大线程数?即向GPU询问值并将其存储在变量中的函数。谢谢你的帮助。


谢谢,我使用以下代码确定了最大线程数:

int dev = 0;
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);

unsigned int maxThreads = deviceProp.maxThreadsPerBlock;

并使用这个数字,我用以下几行计算内核的块和线程:

unsigned int blocksNum = 1+((mSize-1)/maxThreads); // mSize is the size of array
unsigned int threadsNum = 1+((mSize-1)/blocksNum);
dim3 dimGrid(blocksNum, 1, 1);
dim3 dimBlock(threadsNum, 1, 1);
...
kernel<<<dimGrid,dimBlock>>>();

这种形式调用内核是否正确?

谢谢你的帮助。


好的,我使用的是 Nvidia 的 6 号求和内核,并使用了示例代码,它使用下一个代码确定线程和块:

unsigned int threadsNum = (mSize < maxThreads*2) ? nextPow2((mSize + 1)/ 2) : maxThreads;
unsigned int blocksNum = (mSize + (threadsNum * 2 - 1)) / (threadsNum * 2);

此代码适用于我的数组。

4

4 回答 4

3

您可以使用 Driver API 来访问特定内核的属性(在 Driver API 术语中称为 Function)。

使用 API 调用cuFuncGetAttribute,其CUfunction_attribute值等于 CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK。

这给了你:

每个块的最大线程数,超过这个数,函数的启动将失败。这个数字取决于函数和当前加载函数的设备。

于 2013-02-21T22:19:34.527 回答
2

查询设备属性,查看maxThreadsPerBlock

于 2013-02-21T21:21:14.390 回答
1

是的,值 ( maxThreadsPerBlock ) 是 cudaGetDeviceProperties 返回的属性之一。有关完整的示例,请查看deviceQuery 示例

于 2013-02-21T21:20:32.260 回答
0

如果您使用 CUDA 运行时 API 或 cuFuncGetAttribute 和 CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK,您需要的是 cudaFuncGetAttributes,如果您使用的是 CUDA 驱动程序 API,RoBiK 在他的回答中指出。这两个函数都记录在各自 API 文档的执行控制部分。

于 2013-12-20T14:20:12.910 回答