推力+提升代码编译错误
Thrust+boost code compilation error
我有一个奇怪的问题,我无法解决。它与增压+推力代码相连。
法典:
#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 Toolkit\CUDA\v9.2\binvcc.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../普通/公司 -I../../common/inc -I/common/inc -I../-I./-i"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2/include" -I../../common/inc -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" -G --keep-dir x64\调试 -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 项目\矩阵乘法推力\MyFirstMatrixTest.cu"与代码 "2". MyFirstMatrixTest C:\Program Files (x86(\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustoms\CUDA 9.2.目标 707
而这个:
致命错误 C1012 不匹配的括号:缺少字符 "(" MyFirstMatrixTest c:\local\boost\preprocessor\slot\detail\shared.hpp 27
为什么会发生此错误?
谢谢。
嗯,第一个问题是
int N = 100000;
所以 N^2 = 10,000,000,000...(永远不适合int
(。 即 10G*4 字节(浮点数(= 40 GB 的数据。 对我来说,这引发了内存异常。
我遇到的下一个问题是unbounded_array
和generate_n
的结合。只是没有用。但是既然你使用的是推力,那就使用推力类型和算法(我不确定为什么推力有自己的类型来取代 STL,但无论如何(。
我在 2017 模式下使用 Visual Studio 2017 v2015(否则我收到不支持的错误(与 Cuda v9.2 和 Boost 1.67.0。
我修改了您的代码,直到它正确编译: (请注意随机发生器函子中的校正,它首先只生成整数并将它们转换为浮点数(
#include <boost/config/compiler/nvcc.hpp>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/generate.h>
#include <thrust/inner_product.h>
#include <cuda_runtime.h>
#include <cublas_v2.h>
#pragma comment(lib,"cublas.lib")
#include <helper_cuda.h>
#include <boost/numeric/ublas/matrix.hpp>
//#include <boost/numeric/ublas/io.hpp>
using boost::numeric::ublas::matrix;
#include <random>
int main(int argc, char **argv)
{
constexpr size_t N = 100;
constexpr size_t NN = N * N;
thrust::host_vector<float> lineMatrix1; lineMatrix1.reserve(NN);
thrust::host_vector<float> lineMatrix2; lineMatrix2.reserve(NN);
{
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_real_distribution<float> dis(0.0f, 10.0f);
auto genRnd = [&]() { return dis(gen); };
thrust::generate_n(std::back_inserter(lineMatrix1), NN, genRnd);
thrust::generate_n(std::back_inserter(lineMatrix2), NN, genRnd);
}
matrix<float> matrix1(N, N);
thrust::copy_n(std::cbegin(lineMatrix1), NN, std::begin(matrix1.begin1()));
//std::cout << "Matrix 1:n" << matrix1 << std::endl;
matrix<float> matrix2(N, N);
thrust::copy_n(std::cbegin(lineMatrix2), NN, std::begin(matrix2.begin1()));
//std::cout << "Matrix 2:n" << matrix2 << std::endl;
//auto matrix3 = prod(matrix1, matrix2);
auto matrix3 = trans(prod(trans(matrix1), trans(matrix2)));
//std::cout << "Matrix 3:n" << matrix3 << std::endl;
thrust::host_vector<float> hostResult; hostResult.reserve(NN);
for (auto rowIt = matrix3.cbegin1(); rowIt != matrix3.cend1(); rowIt++)
for (const auto& element : rowIt)
hostResult.push_back(element);
std::cout << "Host Result:n";
for (const auto& el : hostResult) std::cout << el << " ";
std::cout << std::endl;
//////boost single core computation finish
//////thrust computation start
findCudaDevice(argc, (const char **)argv);
cublasHandle_t handle;
cublasCreate(&handle);
const float alpha = 1.0f;
const float beta = 0.0f;
thrust::device_vector<float> deviceMatrix1; deviceMatrix1.reserve(NN);
thrust::copy_n(std::cbegin(lineMatrix1), NN, std::back_inserter(deviceMatrix1));
thrust::device_vector<float> deviceMatrix2; deviceMatrix2.reserve(NN);
thrust::copy_n(std::cbegin(lineMatrix2), NN, std::back_inserter(deviceMatrix2));
thrust::device_vector<float> deviceZeroMatrix(NN,0);
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();
cublasDestroy(handle);
thrust::host_vector<float> deviceResult; deviceResult.reserve(NN);
thrust::copy_n(std::cbegin(deviceZeroMatrix), NN, std::back_inserter(deviceResult));
std::cout << "Device Result:n";
for (const auto& el : deviceResult) std::cout << el << " ";
std::cout << std::endl;
//////thrust computation finish
auto accError = thrust::inner_product(std::cbegin(hostResult), std::cend(hostResult), std::cbegin(deviceResult), 0.0f, std::plus<float>(),
[](auto val1, auto val2) { return std::abs(val1 - val2); });
std::cout << "Accumulated error: " << accError << std::endl;
std::cout << "Average error: " << accError/NN << std::endl;
std::cin.ignore();
return 0;
}
编辑:修复了代码。 ublas矩阵存储的矩阵与向量不同,所以我不得不转置矩阵和结果。 此外,事实证明很难将ublas矩阵复制回向量。
编辑 2:编译参数
"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv9.2binnvcc.exe" -gencode=arch=compute_30,code="sm_30,compute_30" --use-local-env -ccbin "C:Program Files (x86)Microsoft Visual Studio 14.0VCbinx86_amd64" -x cu -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv9.2include" -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv9.2include" -G --keep-dir x64Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /FS /Zi /RTC1 /MDd " -o x64Debugkernel.cu.obj "C:CppCudaSoHelp2kernel.cu"
你正在使用lambda - 将'--std=c++11'选项提供给NVCC。
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?