可以动态确定每个块的最大线程数吗?即向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);
此代码适用于我的数组。
答案 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文档的“执行控制”部分中。