     // cout << "\teststructbyvalNoPtr" << endl;
     // teststructbyvalNoPtr();
 
-    // cout << "\ntesttwostructsNoPtr" << endl;
-    // testtwostructsNoPtr();
+    cout << "\ntest_twostructs_byptr_NoPtr" << endl;
+    test_twostructs_byptr_NoPtr();
 
     return 0;
 }

//     cuStreamDestroy(stream);
// }

// __global__ void kernel_twostructs_noptrs(struct MyStruct2NoPtr *mystruct, struct MyStructNoPtr *mystruct2, struct MyStructNoPtr mystruct3, float *out) {
//     if(threadIdx.x == 0) {
//     out[0] = mystruct->p1;
//     out[1] = mystruct->p2;
//     out[2] = mystruct2->p1;
//     out[3] = mystruct3.p1;
//     }
// }

// void testtwostructsNoPtr() {
//     int N = 1024;

//     CUstream stream;
//     cuStreamCreate(&stream, 0);

//     float *hostFloats1 = new float[N];

//     float *gpuFloats1;
//     cudaMalloc((void**)(&gpuFloats1), N * sizeof(float));

//     struct MyStruct2NoPtr mystruct = {5.0f, 6.0f};
//     struct MyStructNoPtr mystruct2 = {7.0f};
//     struct MyStructNoPtr mystruct3 = {8.0f};

//     kernel_twostructs_noptrs<<<dim3(1,1,1), dim3(32,1,1), 0, stream>>>(&mystruct, &mystruct2, mystruct3, (float *)gpuFloats1);
//     cudaMemcpy(hostFloats1, gpuFloats1, 4 * sizeof(float), cudaMemcpyDeviceToHost);
//     cuStreamSynchronize(stream);

//     cout << hostFloats1[0] << endl;
//     cout << hostFloats1[1] << endl;
//     cout << hostFloats1[2] << endl;
//     cout << hostFloats1[3] << endl;

//     assert(hostFloats1[0] == 5);
//     assert(hostFloats1[1] == 6);
//     assert(hostFloats1[2] == 7);

//     cudaFree(gpuFloats1);

//     delete[] hostFloats1;

//     cuStreamDestroy(stream);
// }

int main(int argc, char *argv[]) {
    cout << "\ntestvaluestruct" << endl;

//     cuStreamDestroy(stream);
// }

struct Struct_1float {
    float f1;
};

// __global__ void kernel_structbyval_noptrs(struct Struct_1float mystruct1, float *out) {
//     if(threadIdx.x == 0) {
//         out[0] = mystruct1.p1;
//         out[1] = 5;
