请教一个share memory中定义变量空间大小和地址分配的问题
先说第一个 比如在下面这个函数中
#define THREAD_NUM 128
#define BLOCK_NUM 32
global static void func(int* result, int* result_2, int* result_3 int num) //num = 100;
{
extern shared int arr;
int tid = threadIdx.x;
int bid = blockIdx.x;
int k;
for(k = 0; k < num; k++)
{
arr[k] = k;
}
for(k = 0; k < num; k++)
{
result[k] = arr[k];
}
for(k = bid * THREAD_NUM + tid; k < num; k += BLOCK_NUM * THREAD_NUM)
{
arr[k] = num[k];
}
for(k = bid * THREAD_NUM + tid; k < num; k += BLOCK_NUM * THREAD_NUM)
{
result_2[k] = arr[bid * THREAD_NUM + tid];
result_3[k] = arr[k];
}
}
这样得到的result 和 result_3都只有8个数, 而result_2能得到全部的数, 后面我把arr分别定义成short 和char 就能输出 16个和32个数了 ,因此我理解的是share memory中动态定义的变量arr应该是有大小限制的是吗? 当然我把数组定义成固定大小后就没有这个问题, 都能输出全部的数, 那为什么result_2输出的结果又能把全部数都输出呢, 这个我还是不太明白, 难道这样输出就不受大小限制了吗?
第二个问题 是关于在share memory中动态定义的数组变量的地址问题, 书上说的按照比如这样形式extern shared int arr定义的变量, 它们的地址都是相同的, 要表示不同的变量, 只能用地址偏移量表示, 我下面这个函数
extern shared char arr;
global static void func(…)
{
float* arr1 = (float*)arr;
float* arr2 = (float*)&arr1[8];
for(int j = 0; j < 128; j++)
{
arr1[j] = j;
arr2[j] = arr1[j];
}
}
按照我的理解arr2的地址应该在arr1后面8*sizeof(float)的地方对吧, 为什么把arr2中得不到值呢? 难道地址不是这样分配的吗? arr2的地址从哪儿开始的呢?
麻烦大家给我解答下上面两个问题 , 谢谢了!
[ 本帖最后由 sinoenix 于 2010-6-21 14:29 编辑 ]