Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.94 KB | None | 0 0
  1. #include <cusp/ell_matrix.h>
  2. #include <cusp/print.h>
  3. #include <iostream>
  4.  
  5. #define SPARSE_MEM_OFFSET 116
  6. #define SOLID 35
  7. const int height = 4;
  8.  
  9. texture<float, 2>  texLevelSet1;
  10. float* d_levelSet1;
  11.  
  12. __device__ int oneDimIndexOfXY(int x, int y)
  13. {
  14. return x + y*height;
  15. }
  16.  
  17. __device__ int getDevPtrForSparse(int x,int y,int i,int offset)
  18. {
  19. return oneDimIndexOfXY(x,y) + i*offset;
  20. }
  21.  
  22.  
  23.  
  24. __global__ void createSparseMatrix(int* column_indices, float* values, bool readFromLevelSet1, const int invalid_index, const int column_diff)
  25. {
  26. //float scale = dt / (rho*dx*dx)
  27. float scale = 1.0f;
  28.  
  29. int x = threadIdx.x + blockIdx.x * blockDim.x;
  30.     int y = threadIdx.y + blockIdx.y * blockDim.y;
  31.  
  32. float phi;
  33. if (readFromLevelSet1)
  34. phi = tex2D(texLevelSet1,x,y);
  35. /*else
  36. phi = tex2D(texLevelSet2,x,y);*/
  37.  
  38. if (phi <= 0)
  39. {
  40. int index = oneDimIndexOfXY(x,y);
  41.  
  42. float phiLeft,phiRight,phiUp,phiDown;
  43. if (readFromLevelSet1)
  44. {
  45. phiLeft = tex2D(texLevelSet1,x-1,y);
  46. phiRight = tex2D(texLevelSet1,x+1,y);
  47. phiUp = tex2D(texLevelSet1,x,y+1);
  48. phiDown = tex2D(texLevelSet1,x,y-1);
  49. }
  50. /*else
  51. {
  52. phiLeft = tex2D(texLevelSet1,x-1,y);
  53. phiRight = tex2D(texLevelSet1,x+1,y);
  54. phiUp = tex2D(texLevelSet1,x,y+1);
  55. phiDown = tex2D(texLevelSet1,x,y-1);
  56. }*/
  57.  
  58. if (phiDown <= 0)
  59. {
  60. *(column_indices + getDevPtrForSparse(x,y,0,column_diff)) = oneDimIndexOfXY(x,y-1);
  61. *(values + getDevPtrForSparse(x,y,0,column_diff)) = -scale;
  62. }
  63. else
  64. {
  65. //Om vi vet #N av antal non zeros i A
  66. //*(column_indices + getDevPtrForSparse(x,y,0)) = invalid_index;
  67.  
  68. *(column_indices + getDevPtrForSparse(x,y,0,column_diff)) = oneDimIndexOfXY(x,y-1);
  69. *(values + getDevPtrForSparse(x,y,0,column_diff)) = 0;
  70. }
  71.  
  72.  
  73. if (phiLeft <= 0)
  74. {
  75. *(column_indices + getDevPtrForSparse(x,y,1,column_diff)) = oneDimIndexOfXY(x-1,y);
  76. *(values + getDevPtrForSparse(x,y,1,column_diff)) = -scale;
  77. }
  78. else
  79. {
  80. *(column_indices + getDevPtrForSparse(x,y,1,column_diff)) = oneDimIndexOfXY(x-1,y);
  81. *(values + getDevPtrForSparse(x,y,1,column_diff)) = 0;
  82. }
  83.  
  84. int diagScale = 0;
  85. if (phiLeft != SOLID)
  86. diagScale++;
  87. if (phiRight != SOLID)
  88. diagScale++;
  89. if (phiUp != SOLID)
  90. diagScale++;
  91. if (phiDown != SOLID)
  92. diagScale++;
  93. *(column_indices + getDevPtrForSparse(x,y,2,column_diff)) = oneDimIndexOfXY(x,y);
  94. *(values + getDevPtrForSparse(x,y,2,column_diff)) = diagScale * scale;
  95.  
  96.  
  97. if (phiRight  <= 0)
  98. {
  99. *(column_indices + getDevPtrForSparse(x,y,3,column_diff)) = oneDimIndexOfXY(x+1,y);
  100. *(values + getDevPtrForSparse(x,y,3,column_diff)) = -scale;
  101. }
  102. else
  103. {
  104. *(column_indices + getDevPtrForSparse(x,y,3,column_diff)) = oneDimIndexOfXY(x+1,y);
  105. *(values + getDevPtrForSparse(x,y,3,column_diff)) = 0;
  106. }
  107.  
  108. if (phiUp  <= 0)
  109. {
  110. *(column_indices + getDevPtrForSparse(x,y,4,column_diff)) = oneDimIndexOfXY(x,y+1);
  111. *(values + getDevPtrForSparse(x,y,4,column_diff)) = -scale;
  112. }
  113. else
  114. {
  115. *(column_indices + getDevPtrForSparse(x,y,4,column_diff)) = oneDimIndexOfXY(x,y+1);
  116. *(values + getDevPtrForSparse(x,y,4,column_diff)) = 0;
  117. }
  118. }
  119. else
  120. {
  121. *(column_indices + getDevPtrForSparse(x,y,0,column_diff)) = 0;
  122. *(values + getDevPtrForSparse(x,y,0,column_diff)) = 0;
  123. *(column_indices + getDevPtrForSparse(x,y,1,column_diff)) = 1;
  124. *(values + getDevPtrForSparse(x,y,1,column_diff)) = 1;
  125. *(column_indices + getDevPtrForSparse(x,y,2,column_diff)) = 2;
  126. *(values + getDevPtrForSparse(x,y,2,column_diff)) = 2;
  127. *(column_indices + getDevPtrForSparse(x,y,3,column_diff)) = 3;
  128. *(values + getDevPtrForSparse(x,y,3,column_diff)) = 3;
  129. *(column_indices + getDevPtrForSparse(x,y,4,column_diff)) = 4;
  130. *(values + getDevPtrForSparse(x,y,4,column_diff)) = 4;
  131. }
  132. }
  133. int main()
  134. {
  135.  
  136. int imageSize = height*height*sizeof(float);
  137. cudaMalloc((void**)&d_levelSet1, imageSize);
  138. cudaChannelFormatDesc desc = cudaCreateChannelDesc<float>();
  139. cudaBindTexture2D(NULL, texLevelSet1, d_levelSet1, desc, height, height, sizeof(float)*height);
  140.  
  141. float *tempLevelSet1 = (float*)malloc(imageSize);
  142.  
  143.  
  144. /*
  145. S  S  S S
  146. S  1  1 S
  147. S -1 -1 S
  148. S  S  S S
  149. */
  150.  
  151. tempLevelSet1[0] = SOLID; tempLevelSet1[1] = SOLID; tempLevelSet1[2] = SOLID; tempLevelSet1[3] = SOLID;
  152. tempLevelSet1[4] = SOLID; tempLevelSet1[5] = -1; tempLevelSet1[6] = -1; tempLevelSet1[7] = SOLID;
  153. tempLevelSet1[8] = SOLID; tempLevelSet1[9] = 1; tempLevelSet1[10] = 1; tempLevelSet1[11] = SOLID;
  154. tempLevelSet1[12] = SOLID; tempLevelSet1[13] = SOLID; tempLevelSet1[14] = SOLID; tempLevelSet1[15] = SOLID;
  155.  
  156. cudaMemcpy(d_levelSet1, tempLevelSet1,imageSize,cudaMemcpyHostToDevice);
  157.     free(tempLevelSet1);
  158.  
  159.  
  160. //A matrix
  161. cusp::ell_matrix<int,float,cusp::device_memory> A(height*height,height*height, 5*height*height, 5);
  162.  
  163. for (int x= 0;x<5;x++)
  164. for (int y = 0; y<4;y++)
  165. std::cout << "Adress för (" << y  << "," << x << "): "  << int (thrust::raw_pointer_cast(&A.values(y,x)))  << std::endl;
  166.  
  167.  
  168.  
  169. int column_diff = int(thrust::raw_pointer_cast(&A.values(0,1)) - thrust::raw_pointer_cast(&A.values(0,0)));
  170. createSparseMatrix<<<1,16>>>(thrust::raw_pointer_cast(&A.column_indices(0,0)),thrust::raw_pointer_cast(&A.values(0,0)),true,-1,column_diff);
  171.  
  172.  
  173. cusp::print_matrix(A);
  174. cusp::ell_matrix<int,float,cusp::host_memory> B = A;
  175.  
  176. std::cout << "Från A[5, " << B.column_indices(5,0) << "] = " << B.values(5,0) <<std::endl;
  177. std::cout << "Från A[5, " << B.column_indices(5,1) << "] = " << B.values(5,1) <<std::endl;
  178. std::cout << "Från A[5, " << B.column_indices(5,2) << "] = " << B.values(5,2) <<std::endl;
  179. std::cout << "Från A[5, " << B.column_indices(5,3) << "] = " << B.values(5,3) <<std::endl;
  180. std::cout << "Från A[5, " << B.column_indices(5,4) << "] = " << B.values(5,4) <<std::endl;
  181.  
  182. std::cout << "Från A[6, " << B.column_indices(6,0) << "] = " << B.values(6,0) <<std::endl;
  183. std::cout << "Från A[6, " << B.column_indices(6,1) << "] = " << B.values(6,1) <<std::endl;
  184. std::cout << "Från A[6, " << B.column_indices(6,2) << "] = " << B.values(6,2) <<std::endl;
  185. std::cout << "Från A[6, " << B.column_indices(6,3) << "] = " << B.values(6,3) <<std::endl;
  186. std::cout << "Från A[6,  " << B.column_indices(6,4) << "] = " << B.values(6,4) <<std::endl;
  187.  
  188. std::cout << "Från A[9, " << B.column_indices(9,0) << "] = " << B.values(9,0) <<std::endl;
  189. std::cout << "Från A[9, " << B.column_indices(9,1) << "] = " << B.values(9,1) <<std::endl;
  190. std::cout << "Från A[9, " << B.column_indices(9,2) << "] = " << B.values(9,2) <<std::endl;
  191. std::cout << "Från A[9, " << B.column_indices(9,3) << "] = " << B.values(9,3) <<std::endl;
  192. std::cout << "Från A[9, " << B.column_indices(9,4) << "] = " << B.values(9,4) <<std::endl;
  193.  
  194. std::cout << "Från A[10, " << B.column_indices(10,0) << "] = " << B.values(10,0) <<std::endl;
  195. std::cout << "Från A[10, " << B.column_indices(10,1) << "] = " << B.values(10,1) <<std::endl;
  196. std::cout << "Från A[10, " << B.column_indices(10,2) << "] = " << B.values(10,2) <<std::endl;
  197. std::cout << "Från A[10, " << B.column_indices(10,3) << "] = " << B.values(10,3) <<std::endl;
  198. std::cout << "Från A[10, " << B.column_indices(10,4) << "] = " << B.values(10,4) <<std::endl;
  199.  
  200. cudaUnbindTexture(texLevelSet1);
  201. cudaFree(d_levelSet1);
  202. return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement