在CUDA中动态确定最大线程数?

时间:2013-02-21 21:10:27

标签: cuda

可以动态确定每个块的最大线程数吗?即向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>>>();

这个表单调用内核是否正确?

Thansk的帮助。


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

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

此代码适用于我的数组。

4 个答案:

答案 0 :(得分:3)

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

使用cuFuncGetAttribute 值等于CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK的API调用CUfunction_attribute

这会给你:

  

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

答案 1 :(得分:2)

查询设备属性,查看maxThreadsPerBlock

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您正在使用CUDA运行时API或cuFuncGetAttribute与CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK一起使用,那么您需要的是cudaFuncGetAttributes,如果您使用CUDA驱动程序API,RoBiK在其答案中指出了这一点。这两个函数都记录在相应API文档的“执行控制”部分中。