内核运行但崩溃了CodeXL调试器

时间:2014-04-17 13:22:53

标签: c++ c debugging opencl gpgpu

我正在用c ++ / opencl开发一个应用程序。我的开发环境包括VS12和CodeXL。我的代码一般编译和运行,以及在CodeXL的内核分析器下编译。但是,尝试在调试模式下使用CodeXL始终会导致崩溃。这意味着我可以继续写,但没有内核调试。

从连续的断点开始,我相信我已经把罪魁祸首缩小到了这个嵌套的时间。

// init flows on bush
nextArc = NUM_ARCS;
for(i = 0; i < NUM_NODES; i++) {
  nextArc = nextMinArc[i];
  while(nextArc < NUM_ARCS) {
    flow[nextArc] += demand[i];
    nextArc = nextMinArc[head[nextArc]-1];
  }
}

此代码位于下面的辅助内核函数中。可以在https://gist.github.com/dprentiss/10982016找到完整的内核源代码。

我对内核中的循环结构缺少什么?任何线索为什么它运行但不能用CodeXL调试?

我还想指出这是我第一次使用c / c ++ / opencl。您的一般性评论非常有意义,因为它们具有建设性。我确定我犯了许多C罪。

void initNetwork(const uint sinkNode,
                 uint *topoOrder,
                 constant uint *tail,
                 constant uint *head,
                 constant uint *pointer,
                 float *demand,
                 uint *nextMinArc,
                 uint *nextMaxArc,
                 float *minCost,
                 float *maxCost,
                 float *cost,
                 constant float *fftt,
                 constant float *cap,
                 float *flow)
{
  uint i;
  uint place;
  uint queue;
  uint arc;
  float costCand;
  uint nextArc;

  // set topological order of nodes
  for(i = 0; i < NUM_NODES; ++i) {
    topoOrder[i] = 0;
  }
  topoOrder[0] = sinkNode;
  queue = 1;
  for(place = 0; place < NUM_NODES; ++place) {
    for(i=0; i < NUM_ARCS; ++i) {
      if (head[i] == topoOrder[place] && !isInNodeArray(topoOrder, tail[i])) {
        topoOrder[queue] = tail[i];
        ++queue;
      }
    }
  }

  // init cost
  for(i = 0; i < NUM_ARCS; ++i) {
    cost[i] = FLOAT_MAX;
  }

  // init minimum paths
  for(i = 0; i < NUM_NODES; i++) {
    minCost[i] = FLOAT_MAX;
  }
  minCost[sinkNode-1] = 0;
  nextMinArc[sinkNode-1] = NUM_ARCS;
  for(i = 0; i < NUM_NODES; i++) {
    arc = pointer[topoOrder[i]-1]-1;
    while(head[arc] == topoOrder[i]) {
      costCand = fftt[arc] + minCost[head[arc]-1];
      if(costCand < minCost[tail[arc]-1]) {
        minCost[tail[arc]-1] = costCand;
        nextMinArc[tail[arc]-1] = arc;
      }
      ++arc;
    }
  }

  // init maximum paths
  for(i = 0; i < NUM_NODES; i++) {
    maxCost[i] = minCost[i];
  }

  // init flows on bush
  nextArc = NUM_ARCS;
  for(i = 0; i < NUM_NODES; i++) {
    nextArc = nextMinArc[i];
    while(nextArc < NUM_ARCS) {
      flow[nextArc] += demand[i];
      nextArc = nextMinArc[head[nextArc]-1];
    }
  }

  // init costs on bush
  for(arc = 0; arc < NUM_ARCS; ++arc) {
    if(minCost[head[arc]-1] < minCost[tail[arc]-1]) {
      cost[arc] = setCost(arc, fftt, flow, cap);
    }
  }

  updateCost(minCost, maxCost, cost, flow, sinkNode, pointer, tail, head, topoOrder, nextMinArc, nextMaxArc);
}

同样,整个内核可以在这里找到:https://gist.github.com/dprentiss/10982016

0 个答案:

没有答案