关于cuda实现点乘的问题~

aascom 2010-05-01 08:54:44
float dot(float *x,float *y)

{ float sum=0;

unsigned int mem_size=1500 * sizeof(float);

float* h_A = x;
float* h_B = y;

float* h_C = (float*) malloc(mem_size);

// allocate device memory
float* d_A;
cutilSafeCall(cudaMalloc((void**) &d_A, mem_size));
float* d_B;
cutilSafeCall(cudaMalloc((void**) &d_B, mem_size));

// copy host memory to device
cutilSafeCall(cudaMemcpy(d_A, h_A, mem_size,cudaMemcpyHostToDevice) );
cutilSafeCall(cudaMemcpy(d_B, h_B, mem_size,cudaMemcpyHostToDevice) );

// execute the kernel
dim3 threadBlock(500,1);
dim3 kernelGrid(3,1);
dot_cu<<<kernelGrid,threadBlock>>>(d_A, d_B);

// check if kernel execution generated and error
cutilCheckMsg("Kernel execution failed");

// copy result from device to host
cutilSafeCall(cudaMemcpy(h_C, d_A, mem_size,cudaMemcpyDeviceToHost) );

for(int i=0;i<1500;i++)
sum+=h_C[i];

// clean up memory
free(h_C);
cutilSafeCall(cudaFree(d_A));
cutilSafeCall(cudaFree(d_B));

cudaThreadExit();
return(sum);
}


kernel函数

__global__ void dot_cu(float *A, float *B)
{
unsigned int tid=threadIdx.x+blockDim.x*blockIdx.x;
A[tid]=A[tid]*B[tid];
__syncthreads();

}

想实现两个1500长的一维数组的点乘再求和的运算

但这个程序的运算效率比cpu低 不知道为什么

求指教~~
...全文
163 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycc892009 2010-06-28
  • 打赏
  • 举报
回复
建议你看一下深入浅出cuda
这里有一个介绍优化的问题
http://www.pcinlife.com/article/graphics/2008-06-04/1212575164d532_2.html
  • 打赏
  • 举报
回复
每个block中线程少些(128吧).block数多些.
去掉__syncthreads();
frog_skywalker 2010-05-01
  • 打赏
  • 举报
回复
A和B都在global mem里,访问很慢

1500个线程太少了,体现不出gpu的优势

另外,需要同步吗?

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧