         total_choices *= reel_weights[i];
     }
 
+    int device_id = 0;
+    cudaDeviceProp device_properties;
+    cudaError_t error = cudaGetDeviceProperties(&device_properties, device_id);
+    if (error != cudaSuccess) {
+        printf("cudaGetDeviceProperties returned error code %d, line(%d)\n", error, __LINE__);
+    }
+    else {
+        printf("GPU Device %d: \"%s\" with compute capability %d.%d\n\n", device_id, device_properties.name, device_properties.major, device_properties.minor);
+    }
+
+    double num_symbols_per_reel_sq = pow(num_symbols_per_reel, 2.0);
+
     //copy host possible lines to device possible lines
     printf("**Copying host possible lines to device possible lines\n");
     int *device_possible_lines = NULL;
     size_t size = sizeof(int) * NUM_LINES * NUM_REELS;
-    cudaError_t error = cudaMalloc((void **)&device_possible_lines, size);
+    error = cudaMalloc((void **)&device_possible_lines, size);
     if (error != cudaSuccess) {
     	printf("cudaMalloc device_possible_lines returned error code %d, line(%d)\n", error, __LINE__);
         exit(EXIT_FAILURE);

    }

    //copy device payout frequencies to host payout frequencies
    error = cudaMemcpy(payout_frequencies, device_payout_frequencies, num_symbols_per_reel * sizeof(int), cudaMemcpyDeviceToHost);
    if (error != cudaSuccess){
        fprintf(stderr, "Failed to copy payout frequencies %d from device to host (error code %s)!\n", i, cudaGetErrorString(error));
        exit(EXIT_FAILURE);

    	fprintf(stderr, "Failed to launch calculateExpectedValue kernel (error code %s)!\n", cudaGetErrorString(error));
    	exit(EXIT_FAILURE);
    }

    //wait for all threads to finish
    cudaThreadSynchronize();

    //copy expected values from CUDA device to host memory
