【发布时间】:2013-08-28 06:40:14
【问题描述】:
- 设备:Tesla C2050
- 操作系统:Windows 7 企业版
- IDE:VS 2010
- CUDA:5.0(最新)
第一次在这里提问。我在 CUDA 程序中遇到了一些问题。
我有数百万个四面体,一点在 (0,0,0),所以我可以使用公式:
得到四面体的体积。
所以,这里是代码:
struct Triangle
{
double x1;
double y1;
double z1;
double x2;
double y2;
double z2;
double x3;
double y3;
double z3;
};
还有 CUDA 代码:
__global__ void getResult(double *d_volume ,Triangle *d_triangles, Origin *d_point)
{
extern __shared__ Triangle s_data[];
int tid = threadIdx.x;
int i = blockDim.x * blockIdx.x + threadIdx.x;
s_data[tid] = d_triangles[i];
__syncthreads();
d_volume[i] =s_data[tid].x1 * s_data[tid].y2 * s_data[tid].z3 + \
s_data[tid].y1 * s_data[tid].z2 * s_data[tid].x3 + \
s_data[tid].x2 * s_data[tid].y3 * s_data[tid].z1 - \
s_data[tid].x3 * s_data[tid].y2 * s_data[tid].z1 - \
s_data[tid].x2 * s_data[tid].y1 * s_data[tid].z3 - \
s_data[tid].y3 * s_data[tid].z2 * s_data[tid].x1;
}
我从其他函数中获得了数百万个四面体作为数组。
// Host
Triangle *h_triangles = triangles;
double *h_volume;
// Device
Triangle *d_triangles;
double *d_volume;
// define grid and block size
int numThreadsPerBlock = numTriangles;
int numBlocks = numTrianges / 512;
// Shard memory size
int sharedMemSize = numThreadsPerBlock * sizeof(Triangle);
// allocate host and device memory
size_t memSize_triangles = numBlocks * numThreadsPerBlock * sizeof(Triangle);
size_t memSize_volume = numBlocks * numThreadsPerBlock * sizeof(double);
cudaMalloc( (void **) &d_triangles, memSize_triangles );
cudaMalloc( (void **) &d_volume, memSize_volume );
// Copy host array to device array
cudaMemcpy( d_triangles, h_triangles, memSize_triangles, cudaMemcpyHostToDevice );
cudaMemcpy( d_point, h_point, memSize_point, cudaMemcpyHostToDevice );
// launch kernel
dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
getResult<<< dimGrid, dimBlock, sharedMemSize >>>( d_volume, d_triangles);
// block until the device has completed
cudaThreadSynchronize();
// device to host copy
cudaMemcpy( h_volume, d_volume, memSize_volume, cudaMemcpyDeviceToHost );
// free device memory
cudaFree(d_triangles);
cudaFree(d_volume);
// free host memory
free(h_triangles);
free(h_volume);
到目前为止,一切正常。但是我花费了比我想象的更多的时间来获得这本书。 我的设备是 Tesla C2050(515Gflops),比我的 CPU(单核,20.25Gflops)快 20 倍。 但只提速10倍左右(不包括设备和主机之间复制内存的时间。)
我想知道如何使它比 CPU 代码快 20 倍(for 循环获取音量。)。
谢谢!
PS:也许 cudaMallocPitch() 会帮助我,但是三角形不是矩阵,我不能使用 cudaMemcpy2D() 而不是 cudaMemcpy() 来复制内存。谁能帮我解决这个问题?
【问题讨论】:
-
你试过编译器优化吗?
-
@kumar_m_kiran 我没有尝试过任何编译器优化,你能告诉我如何制作它或给我一些阅读链接吗?谢谢!
-
你如何得到数字'40x'?
-
@Eric 感谢您的回答。我的 CPU(单核)大约是 20.24GFlops,而 Tesla C2050 是 515Gflops。所以,抱歉,大约是 20 倍。
-
为什么你的内核使用共享内存?似乎没有什么明显的理由这样做,不使用会更快
标签: c++ performance cuda