小弟刚入手CUDA,拿一个简单程序做例子。
显卡 GTX460 SE
a是一个1000010000的矩阵,用一个一维数组保存,b是大小为10000的向量,也是一个一维数组,求 ax = ab
数据类型都是float。
block是一维的,用1024个线程,grid也是一维的,用10个block。
程序中使用到了shared memory和合并访问,所以a数组是已经被转置过的。
现测试,所用时间是17ms,但是用CUBLAS库的cublasSgemv函数,只需要6ms。
求高人指点,如何优化??
host端调用kernel,如下:
int main()
{
int n = 10000;
mat_mul_vec<<<10, 1024>>>(n, a, b, ax);
}
device端代码如下:
global void mat_mul_vec(int n, const float *a, const float *b, float *ax)
{
int i;
int tx = threadIdx.x;
int id = blockIdx.x * blockDim.x + threadIdx.x;
float temp = 0.0f;
__shared__ float s_v[10000];
for (i = 0; i + tx < n; i+= 1024)
{
s_v[i + tx] = x[i + tx]
__syncthreads();
}
if (id < n)
{
for (i = 0; i < n; i++)
temp += a[i * n + id] * s_v[i];
ax[id] = temp;
}
}