fork download
  1. /*
  2.  * CUDA上でのポインター配列テスト
  3.  */
  4.  
  5. #include <cuda_runtime_api.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <time.h>
  9.  
  10. __global__ void dev_set_pointer( float **array, float *pointer, int index )
  11. {
  12. array[index] = pointer;
  13. }
  14.  
  15. __global__ void dev_add_const( float **array, float add )
  16. {
  17. float *input;
  18. float *output;
  19.  
  20. input = array[0];
  21. output = array[1];
  22.  
  23. output[threadIdx.x] = input[threadIdx.x] + add;
  24. }
  25.  
  26. int main( void )
  27. {
  28. dim3 grid;
  29. dim3 block;
  30.  
  31. cudaDeviceProp devprop;
  32.  
  33. int size;
  34. int i;
  35. int memmode;
  36. int device;
  37. float add;
  38.  
  39. float *dev_array_0;
  40. float *dev_array_1;
  41. float **dev_pointer_array;
  42.  
  43. float *array_0;
  44. float *array_1;
  45. float **pointer_array;
  46.  
  47. size = 10;
  48. device = 1;
  49. memmode = 0;
  50. add = 7;
  51.  
  52. /* 動作設定 */
  53. printf( "device > " );
  54. scanf( "%d", &device );
  55. printf( "set pointer ( 0 : from host, 1 : from device ) > " );
  56. scanf( "%d", &memmode );
  57.  
  58. /* 乱数初期化 */
  59. srand( time( NULL ) );
  60.  
  61. /* デバイス設定 */
  62. cudaSetDevice( device );
  63.  
  64. /* デバイス名表示 */
  65. cudaGetDeviceProperties( &devprop, device );
  66. printf( "dev : %s\n\n", devprop.name );
  67.  
  68. /* 確保 */
  69. array_0 = (float *)malloc( sizeof(float) * size );
  70. array_1 = (float *)malloc( sizeof(float) * size );
  71. pointer_array = (float **)malloc( sizeof(float *) * 2 );
  72.  
  73. cudaMalloc( &dev_array_0, sizeof(float) * size );
  74. cudaMalloc( &dev_array_1, sizeof(float) * size );
  75. cudaMalloc( &dev_pointer_array, sizeof(float *) * 2 );
  76.  
  77. /* 初期値設定 */
  78. for ( i = 0; i < size; i++ ) {
  79. array_0[i] = (float)rand() / RAND_MAX;
  80. }
  81.  
  82. /* 転送 */
  83. cudaMemcpy( dev_array_0, array_0, sizeof(float) * size, cudaMemcpyHostToDevice );
  84.  
  85. /* カーネル起動準備 */
  86. grid.x = 1;
  87. grid.y = 1;
  88. grid.z = 1;
  89.  
  90. block.x = 1;
  91. block.y = 1;
  92. block.z = 1;
  93.  
  94. /* ポインターのセットをホストで行うかデバイスで行うか */
  95. if ( memmode ) {
  96. puts( "set pointer from device" );
  97.  
  98. dev_set_pointer<<< grid, block >>>( dev_pointer_array, dev_array_0, 0 );
  99. dev_set_pointer<<< grid, block >>>( dev_pointer_array, dev_array_1, 1 );
  100. } else {
  101. puts( "set pointer from host" );
  102.  
  103. pointer_array[0] = dev_array_0;
  104. pointer_array[1] = dev_array_1;
  105.  
  106. cudaMemcpy( dev_pointer_array, pointer_array, sizeof(float *) * 2, cudaMemcpyHostToDevice );
  107. }
  108.  
  109. /* 計算カーネル実行 */
  110. block.x = size;
  111.  
  112. dev_add_const<<< grid, block >>>( dev_pointer_array, add );
  113.  
  114. /* 結果取得 */
  115. cudaMemcpy( array_1, dev_array_1, sizeof(float) * size, cudaMemcpyDeviceToHost );
  116.  
  117. /* 結果確認 */
  118. for ( i = 0; i < size; i++ ) {
  119. printf( "i:%f\to:%f\n", array_0[i], array_1[i] );
  120. }
  121.  
  122. /* 解放 */
  123. free( array_0 );
  124. free( array_1 );
  125. free( pointer_array );
  126.  
  127. cudaFree( dev_array_0 );
  128. cudaFree( dev_array_1 );
  129. cudaFree( dev_pointer_array );
  130.  
  131. return 0;
  132. }
  133.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty