调用其他CUDA函数后使用推力::减少

调用其他CUDA函数后使用推力::减少,cuda,thrust,Cuda,Thrust,在使用我自己的CUDA函数之后,我试图调用一个推力::减少函数。问题是: 如果我在CUDA函数之前使用了推力::reduce(仅用于测试),那么一切都很好,没有错误,没有跳动 但是,如果在运行my CUDA函数后调用了推力::reduce,则会弹出一条消息: cudaErrorLaunchOutOfResources(7): [.../dispatch_reduce.cuh, 454]: too many resources requested for launch [.../dispatch

在使用我自己的CUDA函数之后,我试图调用一个推力::减少函数。问题是:

如果我在CUDA函数之前使用了推力::reduce(仅用于测试),那么一切都很好,没有错误,没有跳动

但是,如果在运行my CUDA函数后调用了推力::reduce,则会弹出一条消息:

cudaErrorLaunchOutOfResources(7): 
[.../dispatch_reduce.cuh, 454]: too many resources requested for launch
[.../dispatch_reduce.cuh, 646]: too many resources requested for launch

我认为可能是我在自己的CUDA内核中更改的块大小或线程大小改变了推力的一些环境变量。但我说得对吗

如果是,如何将这些变量更改回推力值

以下是代码的图示:

//...
// some CUDA functions calculating the coordinate transformation matrix using different combinations of points (called RANSAC in surveying) 
// the CUDA functions use shared memory to speed up 
// all qualified answers leave a "1" in the resulting array (unsigned int res[])
//...

// calling a thrust reduce function to get the number of qualified results (simpling adding the numbers in res[]
void GetTotalQualNum(unsigned int* uQuali, unsigned int uTotalCandiNum, unsigned int* uTotalQualiNum)
{
    unsigned int* d_vec; 
    cudaMalloc*((void**)&d_vec, uTotalCandiNum * sizeof(unsigned int)); 
    cudaMemcpy(d_vec, uQualiRes, uTotalCandiNum * sizeof(unsigned int), cudaMemcpyHostToDevice); 
    thrust::device_ptr<unsigned int> pd_vec = thrust::device_pointer_cast(d_vec); 

    *uTotalQualiNum = thurst::reduce(thrust::device, pd_vec, pd_vec + uTotalCandiNum, 0); 

    cudaFree(d_vec); 
}
/。。。
//一些CUDA函数使用不同的点组合(测量中称为RANSAC)计算坐标变换矩阵
//CUDA功能使用共享内存加速
//所有限定答案在结果数组中都保留“1”(unsigned int res[])
//...
//调用推力减少函数以获得合格结果的数量(简化在res[]中添加数字)
void GetTotalQualNum(无符号int*uQuali,无符号int-uTotalCandiNum,无符号int*uTotalQualiNum)
{
无符号整数*d_向量;
cudaMalloc*((void**)和d_vec,uTotalCandiNum*sizeof(unsigned int));
cudaMemcpy(d_vec,uQualiRes,uTotalCandiNum*sizeof(unsigned int),cudaMemcpyHostToDevice);
推力::装置\u ptr pd\u vec=推力::装置\u指针\u cast(d\u vec);
*uTotalQualiNum=thurst::reduce(推力::装置,pd_-vec,pd_-vec+uTotalCandiNum,0);
cudaFree(d_vec);
}

GPU是带有CUDA 9.1.85和推力v1.9的GTX1070。

在检查了其他问题的答案后,我意识到这可能是由于我为自己的CUDA内核设置的块尺寸或网格尺寸可能会影响推力功能

将dim3 dimBlock从1024修改为512后,该错误不再显示


关于块和网格的适当大小,可以通过搜索关键字找到参考。

“我认为可能是我在自己的CUDA内核中更改的块大小或线程大小改变了推力的某些环境变量。但我是对的吗?”--不,这样的事情不存在。您使用的是什么GPU、CUDA和推力版本?在
CUDA
标签上的许多问题中都提供了关于这个问题的概述。要提供更具体到您的情况的任何类型的响应,我的建议是提供一个如前所述的解决方案,这与环境无关ent变量。它当然会受到您为CUDA代码选择的块大小的影响,事实上,推力错误可能与推力无关,但实际上与CUDA代码有关。积极正确的CUDA错误检查将澄清这一点。@RobertCrovella不确定添加的代码是否足以确定问题@添加了Talonmes版本和GPU型号。