Untitled
unknown
c_cpp
2 years ago
1.7 kB
4
Indexable
/* kernel function to calculate distance between every coordinate */ __global__ void calculateDistances(Coordinate *coordinates, float *distances, int numPoints) { int index = blockIdx.x * blockDim.x + threadIdx.x; int stride = blockDim.x * gridDim.x; for (int i = index; i < numPoints * numPoints; i += stride) { int coord1 = i / numPoints; int coord2 = i % numPoints; /* avoid calculating distance with the point itself */ if (coord1 != coord2) { float dx = coordinates[coord2].x - coordinates[coord1].x; float dy = coordinates[coord2].y - coordinates[coord1].y; distances[i] = sqrt(dx * dx + dy * dy); } else { distances[i] = FLT_MAX; } //printf("Coord1 = (%f, %f), Coord2 = (%f, %f), distance = %f\n", coordinates[coord1].x, coordinates[coord1].y, coordinates[coord2].x, coordinates[coord2].y, distances[i]); } } /* kernel function to check proximity criteria for each point */ __global__ void checkProximityCriteria(float *distances, int *results, int *globalCounter, int numPoints, int K, float D) { int index = blockIdx.x * blockDim.x + threadIdx.x; int stride = blockDim.x * gridDim.x; for (int i = index; i < numPoints && *globalCounter < NUM_SATISFY; i += stride) { int count = 0; for (int j = 0; j < numPoints && *globalCounter < NUM_SATISFY; j++) { if (i != j && distances[i * numPoints + j] < D) { count++; } } if (count >= K) { results[i] = 1; atomicAdd(globalCounter, 1); } else { results[i] = 0; } } }
Editor is loading...