【发布时间】:2016-06-16 14:06:47
【问题描述】:
我试图查看当数据类型大小发生变化时内核中执行的指令数
为了获得自定义大小的数据结构,我创建了如下结构,
#define DATABYTES 40
__host__ __device__
struct floatArray
{
float a[DATABYTES/4];
};
然后创建一个内核只是为了将上述数据类型数组从一个数组复制到另一个数组
__global__
void copy_large_data(floatArray * d_in, floatArray * d_out)
{
d_out[threadIdx.x] = d_in[threadIdx.x];
}
然后用一个块只调用上面的内核 32 个线程
floatArray * d_in;
floatArray * d_out;
cudaMalloc(&d_in, 32 * sizeof(floatArray));
cudaMalloc(&d_out, 32 * sizeof(floatArray));
copy_large_data<<<1, 32>>>(d_in, d_out);
当我使用nvprof 分析程序并检查instructions per warp 时,我可以看到参数值随着DATABYTES 值的变化而变化。
我的问题是,这个指令计数增加的原因是否是由于floatArray 结构内的数组。因为当我们在内核中调用copy的时候,实际上是在a结构体内部展开并复制了数组a的每个元素,创建了更多的指令。
有没有办法使用一条指令在内核中复制自定义结构变量?
【问题讨论】: