【发布时间】:2018-06-15 14:31:12
【问题描述】:
我有一个我无法解决的奇怪问题。它与 boost+thrust 代码相关联。
代码:
#include <boost/config/compiler/nvcc.hpp>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
#include <thrust/copy.h>
#include <thrust/sequence.h>
#include <thrust/random.h>
#include <thrust/generate.h>
#include <thrust/detail/type_traits.h>
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <common/inc/helper_cuda.h>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/operation.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
#include <boost/compute/system.hpp>
#include <boost/compute/command_queue.hpp>
#include <boost/compute/algorithm/generate.hpp>
#include <boost/compute/algorithm/generate_n.hpp>
#include <algorithm>
#include <time.h>
#include <limits.h>
#include <algorithm>
using namespace boost::numeric::ublas;
using namespace boost::random;
using namespace boost::compute;
int main(int argc, char **argv)
{
int N = 100000;
unbounded_array<float> lineMatrix1(N*N);
unbounded_array<float> lineMatrix2(N*N);
generate_n(lineMatrix1.begin(), N*N, []() { return (10 * rand() / RAND_MAX); });
generate_n(lineMatrix2.begin(), N*N, []() { return (10 * rand() / RAND_MAX); });
matrix<float> matrix1(N, N, lineMatrix1);
matrix<float> matrix2(N, N, lineMatrix2);
matrix<float> zeroMatrix(N, N, 0);
matrix<float> zeroMatrix2(N, N, 0);
//boost single core computation start
auto matrix3 = prod(matrix1, matrix2);
//boost single core computation finish
//thrust computation start
findCudaDevice(argc, (const char **)argv);
cublasHandle_t handle;
cublasCreate(&handle);
float alpha = 1.0f;
float beta = 0.0f;
auto result = cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, N, N, N, &alpha, matrix1.data().cbegin(), N, matrix2.data().cbegin(), N, &beta, zeroMatrix.data().begin(), N);
cudaDeviceSynchronize();
thrust::device_vector<float> deviceMatrix1(N*N);
thrust::device_vector<float> deviceMatrix2(N*N);
thrust::device_vector<float> deviceZeroMatrix(N*N, 0);
thrust::copy(matrix1.data().cbegin(), matrix1.data().cend(), deviceMatrix1.begin());
thrust::copy(matrix2.data().cbegin(), matrix2.data().cend(), deviceMatrix2.begin());
auto result2 = cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, N, N, N, &alpha, deviceMatrix1.data().get(), N, deviceMatrix2.data().get(), N, &beta, deviceZeroMatrix.data().get(), N);
cudaDeviceSynchronize();
thrust::copy(deviceZeroMatrix.cbegin(), deviceZeroMatrix.cend(), zeroMatrix2.data().begin());
std::cout << result << std::endl;
std::cout << result2 << std::endl;
//thrust computation finish
float eps = 0.00001;
int differCount1 = 0;
int differCount2 = 0;
for (int i = 0; i < matrix3.size1(); i++)
{
for (int j = 0; j < matrix3.size2(); j++)
{
if (std::abs(matrix3(i, j) != zeroMatrix(i, j)) > eps)
differCount1++;
if (std::abs(matrix3(i, j) != zeroMatrix2(i, j)) > eps)
differCount2++;
}
}
std::cout << differCount1 << std::endl;
std::cout << differCount2 << std::endl;
char c;
std::cin >> c;
return 0;
}
此文件的名称为“myFirstMatrixTest.cu”。
所以,我有编译器错误:
MSB3721 退出命令 ""C:\Program Files\NVIDIA GPU Computing 工具包\CUDA\v9.2\bin\nvcc.exe" -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_35,code=\"sm_35,compute_35\" -gencode=arch=compute_37,code=\"sm_37,compute_37\" -gencode =arch=compute_50,code=\"sm_50,compute_50\" -gencode=arch=compute_52,code=\"sm_52,compute_52\" -gencode=arch=compute_60,code=\"sm_60,compute_60\" -gencode=arch =compute_61,code=\"sm_61,compute_61\" -gencode=arch=compute_70,code=\"sm_70,compute_70\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio \2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX86\x64" -x cu -rdc=true -I./ -I../common/inc -I../../common/inc -I/common/inc -I../ -I./ -I"C:\Program Files \NVIDIA GPU 计算工具包\CUDA\v9.2/include" -I../../common/inc -I"C:\Program 文件\NVIDIA GPU 计算工具包\CUDA\v9.2\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -Xcompiler "/wd 4819" -g -DWIN32 -DWIN32 -D_MBCS -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /FS /Zi /RTC1 /MTd " -o x64/Debug/MyFirstMatrixTest.cu.obj "C:\User Root\Repository\CUDA Projects\MatrixMultiplicationThrust\MyFirstMatrixTest.cu"" 带代码 “2”。 MyFirstMatrixTest C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustomizations\CUDA 9.2.目标707
还有这个:
致命错误 C1012 括号不匹配:缺少字符 ")" MyFirstMatrixTest c:\local\boost\preprocessor\slot\detail\shared.hpp 27
为什么会出现这个错误?
谢谢。
【问题讨论】:
-
要让thrust+boost 工作,您需要安装一个非常具体的版本——CUDA、visual studio 和boost 的组合。你检查过吗?
-
@JHBonarius 我已经安装了 CUDA 9.2 SDK、Boost 和 2017 工作室。 Boost 代码(没有任何推力代码)可以正常工作,推力示例也可以正常工作。
-
为了测试你的代码,我已经将我的 Cuda 更新到 v9.2,现在一切都坏了 :'( 所以在我再次修复它之前无法帮助你。我在尝试让部件工作时遇到了很多问题以前在一起过。听说是通病。
-
我对此进行了阅读,发现 nvcc 在编译 boost 代码时存在问题。您可能应该将主机代码和设备代码分开。