gpt4 book ai didi

c++ - 将数组从 RAM 复制到 GPU 以及从 GPU 复制到 RAM

转载 作者:行者123 更新时间:2023-11-30 03:02:24 26 4
gpt4 key购买 nike

我正在尝试在我的一个项目中引入一些 CUDA 优化。但我认为我在这里做错了什么。我想实现一个简单的矩阵 vector 乘法 (result = matrix * vector)。但是当我想将结果复制回主机时,会出现错误(cudaErrorLaunchFailure)。我的内核 (matrixVectorMultiplicationKernel) 是否有错误,或者我是否错误地调用了 cudaMemcpy?对于这种错误状态,我找不到有用的文档。我认为这完全破坏了 GPU 的状态,因为我无法调用任何 CUDA 内核而不会在第一次出现后再次出现此错误。

edit#1:更新代码,遵循 leftaroundabout 的建议。

// code
...
Eigen::MatrixXf matrix(M, N); // matrix.data() usually should return a float array
Eigen::VectorXf vector(N); // same here for vector.data()
Eigen::VectorXf result(M);
... // fill matrix and vector
float* matrixOnDevice = copyMatrixToDevice(matrix.data(), matrix.rows(), matrix.cols());
matrixVectorMultiplication(matrixOnDevice, vector.data(), result.data(), matrix.rows(), cm.cols());
... // clean up

// helper functions
float* copyMatrixToDevice(const float* matrix, int mRows, int mCols)
{
float* matrixOnDevice;
const int length = mRows*mCols;
const int size = length * sizeof(float);
handleCUDAError(cudaMalloc((void**)&matrixOnDevice, size));
handleCUDAError(cudaMemcpy(matrixOnDevice, matrix, size, cudaMemcpyHostToDevice));
return matrixOnDevice;
}

void matrixVectorMultiplication(const float* matrixOnDevice, const float* vector, float* result, int mRows, int mCols)
{
const int vectorSize = mCols*sizeof(float);
const int resultSize = mRows*sizeof(float);
const int matrixLength = mRows*mCols;
float* deviceVector;
float* deviceResult;
handleCUDAError(cudaMalloc((void**)&deviceVector, vectorSize));
handleCUDAError(cudaMalloc((void**)&deviceResult, resultSize));
handleCUDAError(cudaMemset(deviceResult, 0, resultSize));
handleCUDAError(cudaMemcpy(deviceVector, vector, vectorSize, cudaMemcpyHostToDevice));
int threadsPerBlock = 256;
int blocksPerGrid = (mRows + threadsPerBlock - 1) / threadsPerBlock;
matrixVectorMultiplicationKernel<<<blocksPerGrid, threadsPerBlock>>>(matrixOnDevice, vector, result, mRows, mCols, matrixLength);
// --- no errors yet ---
handleCUDAError(cudaMemcpy(result, deviceResult, resultSize, cudaMemcpyDeviceToHost)); // cudaErrorLaunchFailure
handleCUDAError(cudaFree(deviceVector)); // cudaErrorLaunchFailure
handleCUDAError(cudaFree(deviceResult)); // cudaErrorLaunchFailure
}

__global__ void matrixVectorMultiplicationKernel(const float* matrix, const float* vector, float* result, int mRows, int mCols, int length)
{
int row = blockDim.x * blockIdx.x + threadIdx.x;
if(row < mRows)
{
for(int col = 0, mIdx = row*mCols; col < mCols; col++, mIdx++)
result[row] += matrix[mIdx] * vector[col];
}
}

最佳答案

您的问题是 void copyMatrixToDevice(..., float* matrixOnDevice, ...) 按值获取此指针,即它无法“输出”设备矩阵。您可以使用 void copyMatrixToDevice(..., float** matrixOnDevice, ...) 调用

copyMatrixToDevice(matrix.data(), &matrixOnDevice, matrix.rows(), matrix.cols());

matrixVectorMultiplication 中的result 也有同样的问题。

从长远来看,在 C++ 中,您应该围绕所有这些放置一个适当的类抽象层。

关于c++ - 将数组从 RAM 复制到 GPU 以及从 GPU 复制到 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10178067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com