Cuda矩阵复制程序非常慢
Cuda matrix copy program is very slow
这是我的CUDA代码:
#include<stdio.h>
#include<assert.h>
void verify(float * A, float * B, int size);
__global__ void CopyData(float *d_array, float* d_dest_array, size_t pitch, int cols, int rows)
{
for(int i=0; i<rows; i++){
float *rowData = (float*)(((char*)d_array) + (i*pitch));
for(int j=0; j<cols; j++){
d_dest_array[i*cols+j] = *(rowData+j);
}
}
}
int main(int argc, char **argv)
{
int row, col, i, j;
float time1, time2;
float *d_array; // dev arr which mem will be alloc to
float *d_dest_array; // dev arr that will be a copy
size_t pitch; // ensures correct data struc alignm
if(argc != 3)
{
printf("Usage: %s [row] [col]n", argv[0]);
return 1;
}
row = atoi(argv[1]);
col = atoi(argv[2]);
float *h1_array = new float[col*row];
float *h2_array = new float[col*row];
float *h_ori_array = new float[col*row];
for (i = 0; i<row; i++){
for(j = 0; j<col; j++){
h_ori_array[i*col+j] = i*col + j;
}
}
cudaEvent_t start, stop;
cudaMallocPitch(&d_array, &pitch, col*sizeof(float), row);
cudaMalloc(&d_dest_array, col*row*sizeof(float));
cudaMemcpy2D(d_array, pitch, h_ori_array, col*sizeof(float), col*sizeof(float), row, cudaMemcpyHostToDevice);
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
//CopyData<<<100, 512>>>(d_array, d_dest_array, pitch, col, row);
for (i = 0; i<row; i++){
for(j = 0; j<col; j++){
h1_array[i*col+j] = h_ori_array[i*col+j];
}
}
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&time1, start, stop);
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
CopyData<<<row*col/512, 512>>>(d_array, d_dest_array, pitch, col, row);
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&time2, start, stop);
cudaMemcpy2D(h2_array, pitch, d_dest_array, col*sizeof(float), col*sizeof(float), row, cudaMemcpyDeviceToHost);
verify(h1_array, h2_array, row*col);
free(h1_array); free(h2_array); free(h_ori_array);
cudaFree(d_array); cudaFree(d_dest_array);
printf("Exec time in ser = %f, par = %f ms with pitch %d", time1, time2, (int)pitch);
return 0;
}
void verify(float * A, float * B, int size)
{
for (int i = 0; i < size; i++)
{
assert(A[i]==B[i]);
}
printf("Correct!");
}
它只是复制了一个矩阵。串行和并行版本都写了,以便我可以比较它们。
如果数组大小为64,则给出错误的答案。对于256及以上,它给出正确答案。但是需要很长时间,对于一个512x512的矩阵需要4秒。
我不喜欢cudaMemcpy2D。有人能指出我做错了什么吗?任何关于CUDA编码实践的建议也将受到赞赏。另外,在调用内核时,我如何决定块和网格尺寸?
编辑1:我使用的CopyData函数不使用并行性。我愚蠢地抄了VIHARRI在页面底部的答案。
选择的答案没有指定数据是怎样的从主机复制到设备。谁能告诉我怎么用cudaMallocPitch和cudaMemcpy2D函数?我在找在内核内部进行索引的正确方法以及将2D阵列从主机复制到设备的正确方法。
你只运行一个CUDA线程。(实际上,仔细检查一下,你是在多线程中运行相同的代码,但结果是一样的:你并没有真正利用GPU硬件)。
理想情况下,您需要运行数百或数千个并发线程以获得最佳性能。一种方法是为每个输出元素设置一个线程,然后在每个线程中使用网格、块和线程id来确定要处理哪个输出元素。查看CUDA SDK中的示例,了解使用CUDA进行并行处理的一般模式。
相关文章:
- Python和C 程序与子过程之间的沟通非常缓慢
- 回文程序中非常奇怪的问题
- 我可以使用stackful协程作为steady_timer的等待处理程序吗?steady_imer是在非常stackfu
- Clang编译器错误,适用于非常简单的程序
- 非常简单的 x64 组装/C++应用程序中未解决的外部错误
- 非常基本的C++程序问题 - 二进制表达式的操作数无效
- 在一个使用ffmpeg的非常简单的qt应用程序中出现分段错误
- C++程序使用<bitset>运行非常慢
- 在一个非常简单的程序中检测到内存泄漏.怎么办
- 使用 lambda 函数定义非常小的帮助程序函数是一种好风格吗?
- 尝试运行非常简单的程序时访问冲突
- 非常简单的程序通过了VS2010 c++内存泄漏检查器,但在销毁所有对象后仍然在程序端使用更多内存
- 为什么瓦尔格林德说杀死 9 对于一个非常简单的程序
- Apple Mach-O Linker (ld) 错误在非常简单的程序中
- SEG在非常复杂的(对我来说)程序中出错
- 与测试平台应用程序相比,调试绘制Box2D非常大
- 非常简单的多维数组程序打开Visual Studio JIT
- 如果Windows资源管理器正在运行,Direct3D应用程序运行良好,否则速度会非常慢
- 在一个非常复杂的程序中,替换系统的最佳方法是什么
- 这个使用标准库的非常简单的C++程序不能使用 GCC 编译