     dim3 grid((matrix_dims+block.x-1)/block.x, (matrix_dims+block.y-1)/block.y);
 
     for (i = 0; i < msg_size/matrix_size; i++) {
+        printf("\nlist: %f", *msg_vector_list[i]);
+        // printrow(msg_vector_list[i]); this was a sanity check.  i am sane.
+        
+        // this seems to be sending the same row over and over.  why?
         cudaMemcpy(msgGpu, msg_vector_list[i], nBytes, cudaMemcpyHostToDevice);
         mtxEncrypt<<<grid, block>>>(secretGpu, msgGpu, resultGpu, matrix_dims);
         cudaMemcpy(results[i], resultGpu, nBytes, cudaMemcpyDeviceToHost);
-        printf("\nRESULTS: %d\n", *results);
-    }
-    cudaDeviceSynchronize();
-
-    cudaFree(secretGpu);
+        cudaDeviceSynchronize();
+    }
+
     cudaFree(msgGpu);
     cudaFree(resultGpu);
+    cudaFree(secretGpu);
 
     printf("\n\n5\n\n");
     for (i = 0; i < msg_size/matrix_size; i++) {
-        printf("%d", i);
+    //    printf("%d %f\n\n\n\n", i, results[i]);
         for (j = 0; j < matrix_size; j++) {
-            printf("%d %d\n", i, results[i][j]);
+            printf("%d %f\n", i, results[i][j]);
         }
     }
 

    cudaMalloc((void **)&secretGpu, nBytes);


    cudaMalloc((void **)&msgGpu, (msg_size/matrix_size) * sizeof(float *));
    printf("msg_size/matrix_size: %d \n", msg_size/matrix_size);



    cudaMalloc((void **)&resultGpu, (msg_size/matrix_size) * sizeof(float *));


    cudaMemcpy(secretGpu, *SKey, nBytes, cudaMemcpyHostToDevice);

    printf("2\n");
    for (z = 0; z < msg_size/matrix_size; z++) {
        results[z] = (float *)malloc(matrix_size * sizeof(float));
        memset(results[z], 0, nBytes);
    }
    printf("3\n");

    cudaDeviceProp deviceProp;
    cudaGetDeviceProperties(&deviceProp, 0);
