- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否有可能有效地向 CUDA 设备或从 CUDA 设备复制以恒定(甚至非常量)值跨越的数据?
我想对角化一个大的对称矩阵。
使用 jacobi 算法,在每次迭代中有一堆使用两行和两列的操作。
由于 Matrix 本身太大而无法完全复制到设备,我正在寻找一种将两行和两列复制到设备的方法。
如果使用三角矩阵形式来存储数据会很好,但还有其他缺点,例如
起来。[编辑:即使使用三角形形式,仍然不可能将整个矩阵存储在 GPU 上。]
我查看了一些时间并认识到一个一个地复制跨步值非常慢(同步和异步)。
//编辑:删除解决方案 - 添加答案
最佳答案
感谢 Robert Crovella 给出了使用 cudamemcpy2d 的正确提示。我会附上我的测试代码,让每个人都有可能理解......
如果有人提出使用行优先有序三角矩阵解决复制问题的建议 - 请随时写下另一个答案。
__global__ void setValues (double *arr, double value)
{
arr[blockIdx.x] = value;
}
int main( void )
{
// define consts
static size_t const R = 10, C = 10, RC = R*C;
// create matrices and initialize
double * matrix = (double*) malloc(RC*sizeof(double)),
*final_matrix = (double*) malloc(RC*sizeof(double));
for (size_t i=0; i<RC; ++i) matrix[i] = rand()%R+10;
memcpy(final_matrix, matrix, RC*sizeof(double));
// create vectors on the device
double *dev_col, *dev_row,
*h_row = (double*) malloc(C*sizeof(double)),
*h_col = (double*) malloc(R*sizeof(double));
cudaMalloc((void**)&dev_row, C * sizeof(double));
cudaMalloc((void**)&dev_col, R * sizeof(double));
// choose row / col to copy
size_t selected_row = 7, selected_col = 3;
// since we are in row-major order we can copy the row at once
cudaMemcpy(dev_row, &matrix[selected_row*C],
C * sizeof(double), cudaMemcpyHostToDevice);
// the colum needs to be copied using cudaMemcpy2D
// with Columnsize*sizeof(type) as source pitch
cudaMemcpy2D(dev_col, sizeof(double), &matrix[selected_col],
C*sizeof(double), sizeof(double), R, cudaMemcpyHostToDevice);
// copy back to host to check whether we got the right column and row
cudaMemcpy(h_row, dev_row, C * sizeof(double), cudaMemcpyDeviceToHost);
cudaMemcpy(h_col, dev_col, R * sizeof(double), cudaMemcpyDeviceToHost);
// change values to evaluate backcopy
setValues<<<R, 1>>>(dev_col, 88.0); // column should be 88
setValues<<<C, 1>>>(dev_row, 99.0); // row should be 99
// backcopy
cudaMemcpy(&final_matrix[selected_row*C], dev_row,
C * sizeof(double), cudaMemcpyDeviceToHost);
cudaMemcpy2D(&final_matrix[selected_col], C*sizeof(double), dev_col,
sizeof(double), sizeof(double), R, cudaMemcpyDeviceToHost);
cudaDeviceSynchronize();
// output for checking functionality
printf("Initial Matrix:\n");
for (size_t i=0; i<R; ++i)
{
for (size_t j=0; j<C; ++j) printf(" %lf", matrix[i*C+j]);
printf("\n");
}
printf("\nRow %u values: ", selected_row);
for (size_t i=0; i<C; ++i) printf(" %lf", h_row[i]);
printf("\nCol %u values: ", selected_col);
for (size_t i=0; i<R; ++i) printf(" %lf", h_col[i]);
printf("\n\n");
printf("Final Matrix:\n");
for (size_t i=0; i<R; ++i)
{
for (size_t j=0; j<C; ++j) printf(" %lf", final_matrix[i*C+j]);
printf("\n");
}
cudaFree(dev_col);
cudaFree(dev_row);
free(matrix);
free(final_matrix);
free(h_row);
free(h_col);
cudaDeviceReset();
return 0;
}
关于c++ - 复制跨步数据(进出 CUDA 设备)的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985667/
我是 Java 新手。我在学校有这个练习来创建一个 BasicIO 类和 Main 类来读取和写入文件。 但是我的代码只读取第一句并在无限循环中打印它。 基本IO.java import java.i
我在处理几个正则表达式时遇到了一些麻烦,我之前差点就开始工作了。我基本上需要删除特定 两边的 HTML 注释标签。 这是我目前所拥有的: .replace(/-->/, 'oncl
我正在使用下面的代码将一个 div 部分切换出屏幕,然后完全切换回屏幕。此代码告诉“侧边栏”要移出屏幕多远。但在我的例子中,由于媒体查询应用于侧边栏宽度,此功能存在问题。因此,我需要的代码不是说明侧边
我找不到有关在一段时间内(例如一秒)应向 Firebase 数据库(或类似数据库)发送的最大消息数以及应用程序可以处理接收的最大消息数的最佳实践文档没有显着放缓。例如: //send updated
我在使我的 div 从右侧 float 到屏幕的 50% 时遇到问题,我似乎无法弄清楚为什么它不起作用。 myFunction = function() { var divPosition = $
我们如何知道 cocoapods 是否已安装?在我们的 MAC 中?安装时我将其输出到终端: ERROR: While executing gem ... (NoMethodError) undefi
我正在我的 ubuntu 系统上使用 anaconda 构建深度学习环境。 我对 Anaconda 完全陌生。 我创造了一个环境 conda create -n darkflow python=3.6
是否有可能有效地向 CUDA 设备或从 CUDA 设备复制以恒定(甚至非常量)值跨越的数据? 我想对角化一个大的对称矩阵。 使用 jacobi 算法,在每次迭代中有一堆使用两行和两列的操作。 由于 M
如果我想将数据发送给所有连接的人,是否应该将 redis 订阅事件放在 io.connect 回调之外?或者像这样将它放在 io.connect 中更好: io.on('connection'
我有一些正在序列化的数据。我需要在 .Net 3.5(还不是 4.0)下使用 ADO.NET(也使用企业库)从 VarBinary 列保存和恢复它。 我似乎能够找到并开始工作的唯一接口(interfa
我是一名优秀的程序员,十分优秀!