繁体   English   中英

混合推力和cuBLAS输出意外结果

[英]Mixing Thrust and cuBLAS unexpected results in output

我喜欢推力库,尤其是它如何很好地隐藏cudaMalloc,cudaFree等的复杂性。

我想对矩阵的所有列求和。 因此,我使用cuBlas的“ cublasSgemv”并将矩阵乘以一个矢量。 这是我的代码:

void sEarColSum(std::vector<float>& inMatrix, int colSize)
{
    cublasHandle_t handle; // CUBLAS context
    float al = 1.0f; // al =1
    float bet = 1.0f; // bet =1
    int rowSize = inMatrix.size() / colSize;

    float *devOutputPtr = thrust::raw_pointer_cast(thrust::device_malloc<float>(colSize));

    thrust::device_vector<float> deviceT2DMatrix(inMatrix.begin(), inMatrix.end());
    float* device2DMatrixPtr = thrust::raw_pointer_cast(deviceT2DMatrix.data());

    thrust::device_vector<float> deviceVector(rowSize, 1.0f);
    float* deviceVecPtr = thrust::raw_pointer_cast(deviceVector.data());

    cublasCreate(&handle);
    cublasSgemv(handle, CUBLAS_OP_N, colSize, rowSize, &al, device2DMatrixPtr, colSize, deviceVecPtr, 1, &bet, devOutputPtr, 1);

    std::vector<float> outputVec(colSize);
    cudaMemcpy(outputVec.data(), devOutputPtr, outputVec.size() * sizeof(float), cudaMemcpyDeviceToHost);

    for (auto elem : outputVec)
        std::cout << elem << std::endl;
}



int main(void)
{
    std::vector < float > temp(100, 1); // A vector of 100 elements each 1 
    sEarColSum( temp, 10 ); // Means my vector will have 10 columns and 100/10 = 10 rows  
  //so I expect a output vector with 10 elements. Which all elements have the value of 10. 
}

不幸的是结果只是垃圾。 我期望一个由十个元素组成的向量,每个值都是十。 但是相反,我得到的是:

30
30
-2.80392e+036
30
30
-4.95176e+029
30
6.64319e+016
-3.72391e+037
30

我有什么遗漏吗,我的代码哪里出错了?
其次,是否仍然可以使用调试器检查“ float * device2DMatrixPtr”? Visual Studio会显示其地址,但由于它位于GPU内存中,因此不会显示地址内的数据。

cublas函数gemv执行矩阵向量乘积

y = alpha*A*x + beta*y

上面等式中的y由您分配的devOutputPtr表示,如下所示:

float *devOutputPtr = thrust::raw_pointer_cast(thrust::device_malloc<float>(colSize));

普通的推力分配是这样的:

thrust::device_vector<float> my_vec...

将分配并初始化存储,但是thrust::device_malloc仅分配存储,而不初始化。

因此,您的y “向量”最初包含垃圾。 如果您将beta设置为零,则没关系。 但是,由于您的beta设置为1,因此未初始化区域的内容将添加到结果向量中。

如果您设定

float bet = 0.0f;

我想您会得到预期的结果(我确实做了更改)。

关于这个问题:

其次,是否仍然可以使用调试器检查“ float * device2DMatrixPtr”?

您可以使用deviceT2DMatrix printfstd::cout来打印出deviceT2DMatrix值。 Thrust会为您“复制”设备->主机值,以简化操作。 如果要访问调试器中的设备副本,请在Windows上使用nsight VSE的设备调试功能,或者在Linux上使用nsight EE或cuda-gdb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM