/*
* CUDA上でのポインター配列テスト
*/
#include <cuda_runtime_api.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
__global__ void dev_set_pointer( float **array, float *pointer, int index )
{
array[index] = pointer;
}
__global__ void dev_add_const( float **array, float add )
{
float *input;
float *output;
input = array[0];
output = array[1];
output[threadIdx.x] = input[threadIdx.x] + add;
}
int main( void )
{
dim3 grid;
dim3 block;
cudaDeviceProp devprop;
int size;
int i;
int memmode;
int device;
float add;
float *dev_array_0;
float *dev_array_1;
float **dev_pointer_array;
float *array_0;
float *array_1;
float **pointer_array;
size = 10;
device = 1;
memmode = 0;
add = 7;
/* 動作設定 */
printf( "device > " );
scanf( "%d", &device );
printf( "set pointer ( 0 : from host, 1 : from device ) > " );
scanf( "%d", &memmode );
/* 乱数初期化 */
srand( time( NULL ) );
/* デバイス設定 */
cudaSetDevice( device );
/* デバイス名表示 */
cudaGetDeviceProperties( &devprop, device );
printf( "dev : %s\n\n", devprop.name );
/* 確保 */
array_0 = (float *)malloc( sizeof(float) * size );
array_1 = (float *)malloc( sizeof(float) * size );
pointer_array = (float **)malloc( sizeof(float *) * 2 );
cudaMalloc( &dev_array_0, sizeof(float) * size );
cudaMalloc( &dev_array_1, sizeof(float) * size );
cudaMalloc( &dev_pointer_array, sizeof(float *) * 2 );
/* 初期値設定 */
for ( i = 0; i < size; i++ ) {
array_0[i] = (float)rand() / RAND_MAX;
}
/* 転送 */
cudaMemcpy( dev_array_0, array_0, sizeof(float) * size, cudaMemcpyHostToDevice );
/* カーネル起動準備 */
grid.x = 1;
grid.y = 1;
grid.z = 1;
block.x = 1;
block.y = 1;
block.z = 1;
/* ポインターのセットをホストで行うかデバイスで行うか */
if ( memmode ) {
puts( "set pointer from device" );
dev_set_pointer<<< grid, block >>>( dev_pointer_array, dev_array_0, 0 );
dev_set_pointer<<< grid, block >>>( dev_pointer_array, dev_array_1, 1 );
} else {
puts( "set pointer from host" );
pointer_array[0] = dev_array_0;
pointer_array[1] = dev_array_1;
cudaMemcpy( dev_pointer_array, pointer_array, sizeof(float *) * 2, cudaMemcpyHostToDevice );
}
/* 計算カーネル実行 */
block.x = size;
dev_add_const<<< grid, block >>>( dev_pointer_array, add );
/* 結果取得 */
cudaMemcpy( array_1, dev_array_1, sizeof(float) * size, cudaMemcpyDeviceToHost );
/* 結果確認 */
for ( i = 0; i < size; i++ ) {
printf( "i:%f\to:%f\n", array_0[i], array_1[i] );
}
/* 解放 */
free( array_0 );
free( array_1 );
free( pointer_array );
cudaFree( dev_array_0 );
cudaFree( dev_array_1 );
cudaFree( dev_pointer_array );
return 0;
}
LyoKICogQ1VEQeS4iuOBp+OBruODneOCpOODs+OCv+ODvOmFjeWIl+ODhuOCueODiAogKi8KCiNpbmNsdWRlIDxjdWRhX3J1bnRpbWVfYXBpLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgpfX2dsb2JhbF9fIHZvaWQgZGV2X3NldF9wb2ludGVyKCBmbG9hdCAqKmFycmF5LCBmbG9hdCAqcG9pbnRlciwgaW50IGluZGV4ICkKewoJYXJyYXlbaW5kZXhdID0gcG9pbnRlcjsKfQoKX19nbG9iYWxfXyB2b2lkIGRldl9hZGRfY29uc3QoIGZsb2F0ICoqYXJyYXksIGZsb2F0IGFkZCApCnsKCWZsb2F0ICppbnB1dDsKCWZsb2F0ICpvdXRwdXQ7CgoJaW5wdXQgID0gYXJyYXlbMF07CglvdXRwdXQgPSBhcnJheVsxXTsKCglvdXRwdXRbdGhyZWFkSWR4LnhdID0gaW5wdXRbdGhyZWFkSWR4LnhdICsgYWRkOwp9CgppbnQgbWFpbiggdm9pZCApCnsKCWRpbTMgZ3JpZDsKCWRpbTMgYmxvY2s7CgoJY3VkYURldmljZVByb3AgZGV2cHJvcDsKCglpbnQgc2l6ZTsJCglpbnQgaTsKCWludCBtZW1tb2RlOwoJaW50IGRldmljZTsKCWZsb2F0IGFkZDsKCglmbG9hdCAqZGV2X2FycmF5XzA7CglmbG9hdCAqZGV2X2FycmF5XzE7CglmbG9hdCAqKmRldl9wb2ludGVyX2FycmF5OwoKCWZsb2F0ICphcnJheV8wOwoJZmxvYXQgKmFycmF5XzE7CglmbG9hdCAqKnBvaW50ZXJfYXJyYXk7CgkKCXNpemUgPSAxMDsKCWRldmljZSA9IDE7CgltZW1tb2RlID0gMDsKCWFkZCA9IDc7CgoJLyog5YuV5L2c6Kit5a6aICovCglwcmludGYoICJkZXZpY2UgPiAiICk7CglzY2FuZiggIiVkIiwgJmRldmljZSApOwoJcHJpbnRmKCAic2V0IHBvaW50ZXIgKCAwIDogZnJvbSBob3N0LCAxIDogZnJvbSBkZXZpY2UgKSA+ICIgKTsKCXNjYW5mKCAiJWQiLCAmbWVtbW9kZSApOwoKCS8qIOS5seaVsOWIneacn+WMliAqLwoJc3JhbmQoIHRpbWUoIE5VTEwgKSApOwoKCS8qIOODh+ODkOOCpOOCueioreWumiAqLwoJY3VkYVNldERldmljZSggZGV2aWNlICk7CgoJLyog44OH44OQ44Kk44K55ZCN6KGo56S6ICovCgljdWRhR2V0RGV2aWNlUHJvcGVydGllcyggJmRldnByb3AsIGRldmljZSApOwoJcHJpbnRmKCAiZGV2IDogJXNcblxuIiwgZGV2cHJvcC5uYW1lICk7CgoJLyog56K65L+dICovCglhcnJheV8wID0gKGZsb2F0ICopbWFsbG9jKCBzaXplb2YoZmxvYXQpICogc2l6ZSApOwoJYXJyYXlfMSA9IChmbG9hdCAqKW1hbGxvYyggc2l6ZW9mKGZsb2F0KSAqIHNpemUgKTsKCXBvaW50ZXJfYXJyYXkgPSAoZmxvYXQgKiopbWFsbG9jKCBzaXplb2YoZmxvYXQgKikgKiAyICk7CgoJY3VkYU1hbGxvYyggJmRldl9hcnJheV8wLCBzaXplb2YoZmxvYXQpICogc2l6ZSApOwoJY3VkYU1hbGxvYyggJmRldl9hcnJheV8xLCBzaXplb2YoZmxvYXQpICogc2l6ZSApOwoJY3VkYU1hbGxvYyggJmRldl9wb2ludGVyX2FycmF5LCBzaXplb2YoZmxvYXQgKikgKiAyICk7CgoJLyog5Yid5pyf5YCk6Kit5a6aICovCglmb3IgKCBpID0gMDsgaSA8IHNpemU7IGkrKyApIHsKCQlhcnJheV8wW2ldID0gKGZsb2F0KXJhbmQoKSAvIFJBTkRfTUFYOwoJfQoKCS8qIOi7oumAgSAqLwoJY3VkYU1lbWNweSggZGV2X2FycmF5XzAsIGFycmF5XzAsIHNpemVvZihmbG9hdCkgKiBzaXplLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlICk7CgoJLyog44Kr44O844ON44Or6LW35YuV5rqW5YKZICovCglncmlkLnggPSAxOwoJZ3JpZC55ID0gMTsKCWdyaWQueiA9IDE7CgoJYmxvY2sueCA9IDE7CglibG9jay55ID0gMTsKCWJsb2NrLnogPSAxOwoKCS8qIOODneOCpOODs+OCv+ODvOOBruOCu+ODg+ODiOOCkuODm+OCueODiOOBp+ihjOOBhuOBi+ODh+ODkOOCpOOCueOBp+ihjOOBhuOBiyAqLwoJaWYgKCBtZW1tb2RlICkgewoJCXB1dHMoICJzZXQgcG9pbnRlciBmcm9tIGRldmljZSIgKTsKCgkJZGV2X3NldF9wb2ludGVyPDw8IGdyaWQsIGJsb2NrID4+PiggZGV2X3BvaW50ZXJfYXJyYXksIGRldl9hcnJheV8wLCAwICk7CgkJZGV2X3NldF9wb2ludGVyPDw8IGdyaWQsIGJsb2NrID4+PiggZGV2X3BvaW50ZXJfYXJyYXksIGRldl9hcnJheV8xLCAxICk7Cgl9IGVsc2UgewoJCXB1dHMoICJzZXQgcG9pbnRlciBmcm9tIGhvc3QiICk7CgoJCXBvaW50ZXJfYXJyYXlbMF0gPSBkZXZfYXJyYXlfMDsKCQlwb2ludGVyX2FycmF5WzFdID0gZGV2X2FycmF5XzE7CgoJCWN1ZGFNZW1jcHkoIGRldl9wb2ludGVyX2FycmF5LCBwb2ludGVyX2FycmF5LCBzaXplb2YoZmxvYXQgKikgKiAyLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlICk7Cgl9CgoJLyog6KiI566X44Kr44O844ON44Or5a6f6KGMICovCglibG9jay54ID0gc2l6ZTsKCglkZXZfYWRkX2NvbnN0PDw8IGdyaWQsIGJsb2NrID4+PiggZGV2X3BvaW50ZXJfYXJyYXksIGFkZCApOwoKCS8qIOe1kOaenOWPluW+lyAqLwoJY3VkYU1lbWNweSggYXJyYXlfMSwgZGV2X2FycmF5XzEsIHNpemVvZihmbG9hdCkgKiBzaXplLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0ICk7CgoJLyog57WQ5p6c56K66KqNICovCglmb3IgKCBpID0gMDsgaSA8IHNpemU7IGkrKyApIHsKCQlwcmludGYoICJpOiVmXHRvOiVmXG4iLCBhcnJheV8wW2ldLCBhcnJheV8xW2ldICk7Cgl9CgoJLyog6Kej5pS+ICovCglmcmVlKCBhcnJheV8wICk7CglmcmVlKCBhcnJheV8xICk7CglmcmVlKCBwb2ludGVyX2FycmF5ICk7CgoJY3VkYUZyZWUoIGRldl9hcnJheV8wICk7CgljdWRhRnJlZSggZGV2X2FycmF5XzEgKTsKCWN1ZGFGcmVlKCBkZXZfcG9pbnRlcl9hcnJheSApOwoKCXJldHVybiAwOwp9Cg==