我正在用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