//Level1 V, V
//vec += vec1;
printf("CPU: Naive => vec += vec1
");
for(int i=0;i<SIZE;i++){ printf("%f ", vec[i] + vec1[i]);} printf("
");
printf("CPU: Eigen => vec += vec1
");
ei_vec.row(0) += ei_vec1.row(0);
for(int i=0;i<SIZE;i++){ printf("%f ", ei_vec.row(0).array().data()[i]);} printf("
");
memcpy(ei_vec.row(0).data(), vec, SIZE * sizeof(float));
memcpy(ei_vec1.row(0).data(), vec1, SIZE * sizeof(float));
memcpy(ei_vec2.row(0).data(), vec2, SIZE * sizeof(float));
printf("GPU: Cublas => vec += vec1
");
cublasSaxpy(handle, SIZE, &alpha, cu_vec1,1, cu_vec,1);
checkCudaErrors(cudaMemcpy(out_vec, cu_vec, SIZE * sizeof(float), cudaMemcpyDeviceToHost));
for(int i=0;i<SIZE;i++){ printf("%f ", out_vec[i]);} printf("
");
checkCudaErrors(cudaMemcpy(cu_vec, vec, SIZE * sizeof(float), cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(cu_vec1, vec1, SIZE * sizeof(float), cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(cu_vec2, vec2, SIZE * sizeof(float), cudaMemcpyHostToDevice));
printf("--------------------------------------------
");
//vec *= vec1; //elementwise multiplication
printf("CPU: Naive => vec *= vec1
");
for(int i=0;i<SIZE;i++){ printf("%f ", vec[i]*vec1[i]);} printf("
"); // CPU: Naive
printf("CPU: Eigen => vec *= vec1
");
ei_vec.row(0).array() *= ei_vec1.row(0).array();
for(int i=0;i<SIZE;i++){ printf("%f ", ei_vec.row(0).array().data()[i]);} printf("
"); //CPU: Eigen
memcpy(ei_vec.row(0).data(), vec, SIZE * sizeof(float));
memcpy(ei_vec1.row(0).data(), vec1, SIZE * sizeof(float));
memcpy(ei_vec2.row(0).data(), vec2, SIZE * sizeof(float));
printf("GPU: Cublas => vec *= vec1
");
//y = α op ( A ) x + β y
cublasSgemv(handle, CUBLAS_OP_T, 1, SIZE, &one, cu_vec, 1, cu_vec1, 1, &zero, cu_out_vec, 1); // 정상동작 안함!!!
checkCudaErrors(cudaMemcpy(out_vec, cu_out_vec, SIZE * sizeof(float), cudaMemcpyDeviceToHost));
for(int i=0;i<SIZE;i++){ printf("%f ", out_vec[i]);} printf("
"); // GPU: Cublas
checkCudaErrors(cudaMemcpy(cu_vec, vec, SIZE * sizeof(float), cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(cu_vec1, vec1, SIZE * sizeof(float), cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(cu_vec2, vec2, SIZE * sizeof(float), cudaMemcpyHostToDevice));
printf("--------------------------------------------
");
//vec = vec1 - vec2;
printf("CPU: Naive => vec = vec1 - vec2
");
for(int i=0;i<SIZE;i++){ printf("%f ", vec1[i]-vec2[i]);} printf("
");
printf("CPU: Eigen => vec = vec1 - vec2
");
ei_out_vec.row(0).noalias() = ei_vec1.row(0) - ei_vec2.row(0);
for(int i=0;i<SIZE;i++){ printf("%f ", ei_out_vec.row(0).data()[i]);} printf("
"); //CPU: Eigen
memcpy(ei_vec.row(0).data(), vec, SIZE * sizeof(float));
memcpy(ei_vec1.row(0).data(), vec1, SIZE * sizeof(float));
memcpy(ei_vec2.row(0).data(), vec2, SIZE * sizeof(float));
printf("GPU: Cublas => vec = vec1 - vec2
");
cublasSaxpy(handle, SIZE, &minus, cu_vec2,1, cu_vec1,1);
checkCudaErrors(cudaMemcpy(out_vec, cu_vec1, SIZE * sizeof(float), cudaMemcpyDeviceToHost));
for(int i=0;i<SIZE;i++){ printf("%f ", out_vec[i]);} printf("
");
checkCudaErrors(cudaMemcpy(cu_vec, vec, SIZE * sizeof(float), cudaMemcpyHostToDevice));
checkCu\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0daErrors(cudaMemcpy(cu_vec1, vec1, SIZE * sizeof(float), cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(cu_vec2, vec2, SIZE * sizeof(float), cudaMemcpyHostToDevice));
printf("--------------------------------------------
");
//vec = vec1.cwiseProduct(vec2);
printf("CPU: Naive => vec = vec1.cwiseProduct(vec2)
");
for(int i=0;i<SIZE;i++){ printf("%f ", vec1[i]*vec2[i]);} printf("
"); // CPU: Naive
printf("CPU: Eigen => vec = vec1.cwiseProduct(vec2)
");
ei_vec.row(0).row(0).noalias() = ei_vec1.row(0).cwiseProduct(ei_vec2.row(0));
for(int i=0;i<SIZE;i++){ printf("%f ", ei_vec.row(0).row(0).data()[i]);} printf("
"); //CPU: Eigen
memcpy(ei_vec.row(0).data(), vec, SIZE * sizeof(float));
memcpy(ei_vec1.row(0).data(), vec1, SIZE * sizeof(float));
memcpy(ei_vec2.row(0).data(), vec2, SIZE * sizeof(float));
printf("--------------------------------------------
");