我有一個CUDA程序似乎正在打擊某些資源的某種限制,但我無法弄清楚這個資源是什麼。這裏是內核函數:CUDA限制似乎已經達到,但是有什麼限制?
__global__ void DoCheck(float2* points, int* segmentToPolylineIndexMap,
int segmentCount, int* output)
{
int segmentIndex = threadIdx.x + blockIdx.x * blockDim.x;
int pointCount = segmentCount + 1;
if(segmentIndex >= segmentCount)
return;
int polylineIndex = segmentToPolylineIndexMap[segmentIndex];
int result = 0;
if(polylineIndex >= 0)
{
float2 p1 = points[segmentIndex];
float2 p2 = points[segmentIndex+1];
float2 A = p2;
float2 a;
a.x = p2.x - p1.x;
a.y = p2.y - p1.y;
for(int i = segmentIndex+2; i < segmentCount; i++)
{
int currentPolylineIndex = segmentToPolylineIndexMap[i];
// if not a different segment within out polyline and
// not a fake segment
bool isLegit = (currentPolylineIndex != polylineIndex &&
currentPolylineIndex >= 0);
float2 p3 = points[i];
float2 p4 = points[i+1];
float2 B = p4;
float2 b;
b.x = p4.x - p3.x;
b.y = p4.y - p3.y;
float2 c;
c.x = B.x - A.x;
c.y = B.y - A.y;
float2 b_perp;
b_perp.x = -b.y;
b_perp.y = b.x;
float numerator = dot(b_perp, c);
float denominator = dot(b_perp, a);
bool isParallel = (denominator == 0.0);
float quotient = numerator/denominator;
float2 intersectionPoint;
intersectionPoint.x = quotient * a.x + A.x;
intersectionPoint.y = quotient * a.y + A.y;
result = result | (isLegit && !isParallel &&
intersectionPoint.x > min(p1.x, p2.x) &&
intersectionPoint.x > min(p3.x, p4.x) &&
intersectionPoint.x < max(p1.x, p2.x) &&
intersectionPoint.x < max(p3.x, p4.x) &&
intersectionPoint.y > min(p1.y, p2.y) &&
intersectionPoint.y > min(p3.y, p4.y) &&
intersectionPoint.y < max(p1.y, p2.y) &&
intersectionPoint.y < max(p3.y, p4.y));
}
}
output[segmentIndex] = result;
}
這裏被執行內核函數調用:是
DoCheck<<<702, 32>>>(
(float2*)devicePoints,
deviceSegmentsToPolylineIndexMap,
numSegments,
deviceOutput);
參數的尺寸如下:
- devicePoints = 22464個float2s = 179,712字節
- deviceSegmentsToPolylineIndexMap = 22,463整數= 89,852字節
- 個numSegments = 1個INT = 4個字節
- deviceOutput = 22463個整數= 89852個字節
當我執行這個內核,它崩潰視頻卡。這似乎是我遇到了某種限制,因爲如果我使用DoCheck<<<300, 32>>>(...);
執行內核,它可以工作。要明確,參數是相同的,只是塊的數量是不同的。
任何想法爲什麼一個崩潰的視頻驅動程序,而另一個不?失敗的人似乎仍然在牌的數量限制之內。
更新 在我的系統配置的更多信息:
- 顯卡:nVidia的8800GT
- CUDA版本:1.1
- 操作系統:Windows Server 2008 R2
我也在筆記本電腦上用以下配置嘗試過,但得到了AME結果:
- 顯卡:的NVIDIA Quadro FX 880M
- CUDA版本:1.2
- 操作系統:Windows 7 64位
如果這是一塊顯卡,可能掛鐘時間。顯示驅動程序有一個看門狗定時器,可以殺死需要幾秒鐘才能完成的內核。實施細節和解決方法是特定於操作系統的。你使用的是什麼操作系統,卡和CUDA版本? – talonmies
有趣。好的,我會用這些信息更新問題。 –
看門狗定時器在Windows上仍然是個問題嗎?如果是這樣,你的內核可能需要很長時間才能執行。 – Eric