Browse Source

Add debugging information in starpufft/*.

Cyril Roelandt 12 years ago
parent
commit
6ae7d8f8dc
4 changed files with 91 additions and 19 deletions
  1. 5 1
      starpufft/starpufft.h
  2. 50 0
      starpufft/starpufftx.c
  3. 18 9
      starpufft/starpufftx1d.c
  4. 18 9
      starpufft/starpufftx2d.c

+ 5 - 1
starpufft/starpufft.h

@@ -18,6 +18,9 @@
 #include <stdio.h>
 #include <complex.h>
 #include <starpu.h>
+#ifdef STARPU_USE_CUDA
+#include <cufft.h>
+#endif /* !STARPU_USE_CUDA */
 
 #define STARPUFFT_FORWARD -1
 #define STARPUFFT_INVERSE 1
@@ -50,7 +53,8 @@ void starpufft(destroy_plan)(starpufft(plan) p); \
 \
 void starpufft(startstats)(void); \
 void starpufft(stopstats)(void); \
-void starpufft(showstats)(FILE *out);
+void starpufft(showstats)(FILE *out); \
+void starpufft(report_error)(const char *func, const char *file, int line, cufftResult status);
 
 __STARPUFFT_INTERFACE(__STARPUFFT, double)
 __STARPUFFT_INTERFACE(__STARPUFFTF, float)

+ 50 - 0
starpufft/starpufftx.c

@@ -464,3 +464,53 @@ STARPUFFT(showstats)(FILE *out)
 		}
 	}
 }
+
+#ifdef STARPU_USE_CUDA
+void
+STARPUFFT(report_error)(const char *func, const char *file, int line, cufftResult status)
+{
+	char *errormsg;
+	switch (status)
+	{
+	case CUFFT_SUCCESS:
+		errormsg = "success"; /* It'd be weird to get here. */
+		break;
+	case CUFFT_INVALID_PLAN:
+		errormsg = "invalid plan";
+		break;
+	case CUFFT_ALLOC_FAILED:
+		errormsg = "alloc failed";
+		break;
+	case CUFFT_INVALID_TYPE:
+		errormsg = "invalid type";
+		break;
+	case CUFFT_INVALID_VALUE:
+		errormsg = "invalid value";
+		break;
+	case CUFFT_INTERNAL_ERROR:
+		errormsg = "internal error";
+		break;
+	case CUFFT_EXEC_FAILED:
+		errormsg = "exec failed";
+		break;
+	case CUFFT_SETUP_FAILED:
+		errormsg = "setup failed";
+		break;
+	case CUFFT_INVALID_SIZE:
+		errormsg = "invalid size";
+		break;
+	case CUFFT_UNALIGNED_DATA:
+		errormsg = "unaligned data";
+		break;
+	default:
+		errormsg = "unknown error";
+		break;
+	}
+	fprintf(stderr, "oops in %s (%s:%d)... %d: %s\n",
+			func, file, line, status, errormsg);
+	STARPU_ABORT();
+}
+
+#define STARPU_CUFFT_REPORT_ERROR(status) \
+	STARPUFFT(report_error)(__starpu_func__, __FILE__, __LINE__, status)
+#endif /* !STARPU_USE_CUDA */

+ 18 - 9
starpufft/starpufftx1d.c

@@ -93,9 +93,11 @@ STARPUFFT(fft1_1d_plan_gpu)(void *args)
 	cufftResult cures;
 
 	cures = cufftPlan1d(&plan->plans[workerid].plan1_cuda, n2, _CUFFT_C2C, 1);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 	cufftSetStream(plan->plans[workerid].plan1_cuda, starpu_cuda_get_local_stream());
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 }
 
 static void
@@ -116,7 +118,8 @@ STARPUFFT(fft1_1d_kernel_gpu)(void *descr[], void *_args)
 	task_per_worker[workerid]++;
 
 	cures = _cufftExecC2C(plan->plans[workerid].plan1_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 
 	STARPUFFT(cuda_twiddle_1d_host)(out, roots, n2, i);
 
@@ -137,9 +140,11 @@ STARPUFFT(fft2_1d_plan_gpu)(void *args)
 	int workerid = starpu_worker_get_id();
 
 	cures = cufftPlan1d(&plan->plans[workerid].plan2_cuda, n1, _CUFFT_C2C, n3);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 	cufftSetStream(plan->plans[workerid].plan2_cuda, starpu_cuda_get_local_stream());
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 }
 
 static void
@@ -158,7 +163,8 @@ STARPUFFT(fft2_1d_kernel_gpu)(void *descr[], void *_args)
 
 	/* NOTE using batch support */
 	cures = _cufftExecC2C(plan->plans[workerid].plan2_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 
 	cudaStreamSynchronize(starpu_cuda_get_local_stream());
 }
@@ -412,9 +418,11 @@ STARPUFFT(fft_1d_plan_gpu)(void *args)
 	int workerid = starpu_worker_get_id();
 
 	cures = cufftPlan1d(&plan->plans[workerid].plan_cuda, n, _CUFFT_C2C, 1);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 	cufftSetStream(plan->plans[workerid].plan_cuda, starpu_cuda_get_local_stream());
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 }
 
 static void
@@ -431,7 +439,8 @@ STARPUFFT(fft_1d_kernel_gpu)(void *descr[], void *args)
 	task_per_worker[workerid]++;
 
 	cures = _cufftExecC2C(plan->plans[workerid].plan_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 
 	cudaStreamSynchronize(starpu_cuda_get_local_stream());
 }

+ 18 - 9
starpufft/starpufftx2d.c

@@ -57,9 +57,11 @@ STARPUFFT(fft1_2d_plan_gpu)(void *args)
 	cufftResult cures;
 
 	cures = cufftPlan2d(&plan->plans[workerid].plan1_cuda, n2, m2, _CUFFT_C2C);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 	cufftSetStream(plan->plans[workerid].plan1_cuda, starpu_cuda_get_local_stream());
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 }
 
 static void
@@ -83,7 +85,8 @@ STARPUFFT(fft1_2d_kernel_gpu)(void *descr[], void *_args)
 	task_per_worker[workerid]++;
 
 	cures = _cufftExecC2C(plan->plans[workerid].plan1_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 
 	/* synchronization is done after the twiddling */
 	STARPUFFT(cuda_twiddle_2d_host)(out, roots0, roots1, n2, m2, i, j);
@@ -104,9 +107,11 @@ STARPUFFT(fft2_2d_plan_gpu(void *args))
 	int workerid = starpu_worker_get_id();
 
 	cures = cufftPlan2d(&plan->plans[workerid].plan2_cuda, n1, m1, _CUFFT_C2C);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 	cufftSetStream(plan->plans[workerid].plan2_cuda, starpu_cuda_get_local_stream());
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 }
 
 static void
@@ -132,7 +137,8 @@ STARPUFFT(fft2_2d_kernel_gpu)(void *descr[], void *_args)
 
 	for (n = 0; n < n3*m3; n++) {
 		cures = _cufftExecC2C(plan->plans[workerid].plan2_cuda, in + n * n1*m1, out + n * n1*m1, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE);
-		STARPU_ASSERT(cures == CUFFT_SUCCESS);
+		if (cures == CUFFT_SUCCESS)
+			STARPU_CUFFT_REPORT_ERROR(cures);
 	}
 
 	cudaStreamSynchronize(starpu_cuda_get_local_stream());
@@ -398,9 +404,11 @@ STARPUFFT(fft_2d_plan_gpu)(void *args)
 	int workerid = starpu_worker_get_id();
 
 	cures = cufftPlan2d(&plan->plans[workerid].plan_cuda, n, m, _CUFFT_C2C);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 	cufftSetStream(plan->plans[workerid].plan_cuda, starpu_cuda_get_local_stream());
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 }
 
 static void
@@ -417,7 +425,8 @@ STARPUFFT(fft_2d_kernel_gpu)(void *descr[], void *args)
 	task_per_worker[workerid]++;
 
 	cures = _cufftExecC2C(plan->plans[workerid].plan_cuda, in, out, plan->sign == -1 ? CUFFT_FORWARD : CUFFT_INVERSE);
-	STARPU_ASSERT(cures == CUFFT_SUCCESS);
+	if (cures == CUFFT_SUCCESS)
+		STARPU_CUFFT_REPORT_ERROR(cures);
 
 	cudaStreamSynchronize(starpu_cuda_get_local_stream());
 }