cuda“;无效参数";第二个内核上的错误

cuda“;无效参数";第二个内核上的错误,cuda,Cuda,我对内核启动有问题。我有一个使用一个大内核的程序。现在,由于同步问题,我需要将它分成两部分。第一个内核执行一些init操作,并将参数的子集传递给第二个内核。只运行第一个内核就可以了。由于缺少初始化,仅运行第二个内核在执行时失败,但内核本身已启动。在一行中同时运行这两个命令会导致第二个内核出现“无效参数”错误。如果有必要,我会提供代码,但现在还不知道它会有什么帮助。提前谢谢 编辑: 这里是请求的启动代码: void DeviceManager::integrate(){ assert(host

我对内核启动有问题。我有一个使用一个大内核的程序。现在,由于同步问题,我需要将它分成两部分。第一个内核执行一些init操作,并将参数的子集传递给第二个内核。只运行第一个内核就可以了。由于缺少初始化,仅运行第二个内核在执行时失败,但内核本身已启动。在一行中同时运行这两个命令会导致第二个内核出现“无效参数”错误。如果有必要,我会提供代码,但现在还不知道它会有什么帮助。提前谢谢

编辑: 这里是请求的启动代码:

void DeviceManager::integrate(){
  assert(hostArgs->neighborhoodsSize > 0);
  size_t maxBlockSize;
  size_t blocks;
  size_t threadsPerBlock;
  // init patch kernel
  maxBlockSize = 64;
  blocks = (hostArgs->patchesSize /maxBlockSize);
  if(0 != hostArgs->patchesSize % maxBlockSize){
    blocks++;
  }
  threadsPerBlock = maxBlockSize;
  std::cout << "blocks: " << blocks << ", threadsPerBlock: " << threadsPerBlock << std::endl;
  initPatchKernel<CUDA_MAX_SPACE_DIMENSION><<<blocks,threadsPerBlock>>>(devicePatches, hostArgs->patchesSize);
  cudaDeviceSynchronize();

  //calc kernel
  maxBlockSize = 64;
  blocks = (hostArgs->neighborhoodsSize /maxBlockSize);
  if(0 != hostArgs->neighborhoodsSize % maxBlockSize){
    blocks++;
  }
  threadsPerBlock = maxBlockSize;
  size_t maxHeapSize = hostArgs->patchesSize * (sizeof(LegendreSpace) + sizeof(LinearSpline)) + hostArgs->neighborhoodsSize * (sizeof(ReactionDiffusionCCLinearForm) + sizeof(ReactionDiffusionCCBiLinearForm));
  std::cout << "maxHeapSize: " << maxHeapSize << std::endl;
  cudaDeviceSetLimit(cudaLimitMallocHeapSize, maxHeapSize);
  std::cout << "blocks: " << blocks << ", threadsPerBlock: " << threadsPerBlock << std::endl;
  integrateKernel<CUDA_MAX_SPACE_DIMENSION><<<blocks,threadsPerBlock>>>(deviceNeighborhoods, hostArgs->neighborhoodsSize, devicePatches, hostArgs->patchesSize, hostArgs->biLinearForms, hostArgs->linearForms, deviceRes);
  cudaDeviceSynchronize();
}
抱歉没有提到这一点,包装不是由我这么抱歉没有粘贴的把戏。 故障前的输出如下所示:

blocks: 1, threadsPerBlock: 64
maxHeapSize: 4480
blocks: 1, threadsPerBlock: 64
message: invalid argument


cudaLimitMallocHeapSize控制malloc()和free()设备系统调用使用的堆的大小(以字节为单位)。在启动任何使用malloc()或free()设备系统调用的内核之前,必须执行设置cudaLimitMallocHeapSize,否则将返回cudaErrorInvalidValue。此限制仅适用于计算能力为2.0及更高的设备。试图在计算能力低于2.0的设备上设置此限制将导致返回错误CudaErrorRunSupportedLimit。

我相信提供代码会有所帮助。我特别感兴趣的是第二次内核调用的启动参数以及它们是如何派生的。至少向我们展示一下内存初始化和内核调用代码。我没有看到任何错误检查。你怎么知道你得到了一个内核失败和“无效参数错误”?另外,在两个内核启动之前,您将输出block和threadsPerBlock变量。在失败之前,您会得到什么输出?请在所有cuda*函数中添加错误处理,而不仅仅是在启动之后。我已经提交了一个答案,我认为这将解决您的问题。非常感谢您的回答。当我有时间的时候,我会尝试你的建议,这可能会持续几天,很抱歉。现在我有时间检查我的代码,并记住你的答案。我的内存分配设计中有不同的错误。我现在首先调用cudaDeviceSetLimit(得到一个具有计算能力2.0的卡),而不是内核来初始化一些内存。比主内核(integrateKernel)更重要的是,它可以自行分配和释放一些内存。最后是一个新内核来释放init内核初始化的内存(我忘了这么做)。现在一切正常。再次感谢你的回答,你真的让我解脱了。
blocks: 1, threadsPerBlock: 64
maxHeapSize: 4480
blocks: 1, threadsPerBlock: 64
message: invalid argument