在 Visual Studio C++ 项目中使用 cusp
Posted
技术标签:
【中文标题】在 Visual Studio C++ 项目中使用 cusp【英文标题】:Using cusp in a Visual Studio C++ project 【发布时间】:2014-02-21 18:37:31 【问题描述】:我在 VS2012 Ultimate 上使用 cusp v.0.4.0、cuda V5.5。我使用新项目向导创建了一个 CUDA 项目,并将尖头路径添加到它的 project properties\VC++ Directories\Include Directories。我将代码写在VS2012生成的*.cu文件中,项目编译构建成功,但执行时出现R6010错误。我通过将 project properties\CUDA C/C++\Device\Code Generation 的默认值从 compute_10,sm_10 更改为 compute_30,sm_30 解决了这个问题>,这是我的sm版本。一切正常。
现在我想在 C++ 项目中使用相同的代码。当我将它添加到一个新的 C++ 项目并将尖头路径添加到 VC++ 包含目录 时,项目构建失败并在多个文件中出现大量语法错误:
错误 5 错误 C2144:语法错误:'void' 应该以 ';' 开头c:\users\administrator\downloads\android\cusplibrary-master\cusplibrary-master\cusp\detail\device\spmv\coo_flat.h 164
22 IntelliSense:应为“;” c:\Users\Administrator\Downloads\Android\cusplibrary-master\cusplibrary-master\cusp\detail\device\spmv\coo_flat.h 272
...
这样的错误还有 108 个。如果这些是语法错误,为什么它们没有出现在我的 CUDA 解决方案中?如何在 C++ 项目中成功构建代码?
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <cusp/krylov/cg.h>
#include <cusp/csr_matrix.h>
#include <cusp/hyb_matrix.h>
#include <cusp/gallery/poisson.h>
#include <cusp/io/matrix_market.h>
#include <cusp\print.h>
#include <fstream>
#include <conio.h>
#include <math.h>
#include <iostream>
#include <windows.h>
using namespace std;
int main()
int N = 10000;
int nnz = 1005070;
DWORD dw1 = GetTickCount();
cusp::csr_matrix<int,double,cusp::device_memory> A(N,N,nnz);
DWORD dw2 = GetTickCount();
double dw3 = dw2 - dw1;
cout << "alocating A matrix time : " << dw3 << endl;
ifstream rowOffseFile;
ifstream colIndexFile;
ifstream valuesFile;
ifstream ansFile;
rowOffseFile.open("C:\\Users\\Administrator\\Documents\\MATLAB\\10000_0.01_RO.txt");
int *rowOffset = NULL;
rowOffset = (int *)malloc((N+1)*sizeof(int));
for (int i = 0; i < N+1; i++)
rowOffset[i] = 0;
int i =0;
if (rowOffseFile.is_open())
while (!rowOffseFile.eof())
rowOffseFile >> rowOffset[i];
i+=1;
rowOffseFile.close();
DWORD dw10 = GetTickCount();
for (int i = 0; i < (N+1); i++)
A.row_offsets[i] = rowOffset[i];
DWORD dw11 = GetTickCount();
double dw12 =dw11 - dw10;
///////////////////////////////////////////////////////////////////////////////////
colIndexFile.open("C:\\Users\\Administrator\\Documents\\MATLAB\\10000_0.01_CI.txt");
int *colIndex = NULL;
colIndex = (int *)malloc((nnz)*sizeof(int));
for (int i = 0; i < nnz; i++)
colIndex[i] = 0;
i =0;
if (colIndexFile.is_open())
while (!colIndexFile.eof())
colIndexFile >> colIndex[i];
//int temp = (int)output;
//cout<< colIndex[i] << endl;
i+=1;
colIndexFile.close();
DWORD ex1 = GetTickCount();
for (int i = 0; i < nnz; i++)
A.column_indices[i] = colIndex[i];
DWORD ex2 = GetTickCount();
double t = ex2-ex1;
/////////////////////////////////////////////////////////////
valuesFile.open("C:\\Users\\Administrator\\Documents\\MATLAB\\10000_0.01_V.txt");
double *values = NULL;
values = (double *)malloc((nnz)*sizeof(double));
for (int i = 0; i < nnz; i++)
values[i] = 0;
i =0;
if (valuesFile.is_open())
while (!valuesFile.eof())
valuesFile >> values[i];
//int temp = (int)output;
//cout<< colIndex[i] << endl;
i+=1;
valuesFile.close();
DWORD ex3 = GetTickCount();
for (int i = 0; i < nnz; i++)
A.values[i] = values[i];
DWORD ex4 = GetTickCount();
t = t+ex4-ex3+dw12;
cout << "time spent on initializing: " << t <<endl;
DWORD dw7 = GetTickCount();
cusp::array1d<double,cusp::device_memory> X(N,0.);
cusp::array1d<double,cusp::device_memory> B(N,1.);
DWORD dw8 = GetTickCount();
double dw9 = dw8-dw7;
cout << "time spent on allocating X and B :" << dw9 << endl;
DWORD dw4 = GetTickCount();
cusp::krylov::cg(A,X,B);
DWORD dw5 = GetTickCount();
double dw6 = dw5 - dw4;
std::cout << "time spenton solving : " << dw6 << std::endl;
//cusp::print(X);
ansFile.open("C:\\Users\\Administrator\\Documents\\MATLAB\\10000_0.01_X.txt");
double *ans = NULL;
ans = (double *)malloc((N)*sizeof(double));
for (int i = 0; i < N; i++)
ans[i] = 0;
i =0;
if (ansFile.is_open())
while (!ansFile.eof())
ansFile >> ans[i];
//int temp = (int)output;
//cout<< rowOffset[i] << endl;
i+=1;
ansFile.close();
double tol = 0;
double temp = 0;
for (int i = 0; i < N; i++)
temp = abs(X[i] - ans[i]);
if (temp>tol)
tol = temp;
cout << "max tol is :" << tol << endl;
getch();
return 0;
【问题讨论】:
【参考方案1】:“现在我想在一个用 C++ 编写的项目中使用这段代码,但是当我将同样的代码添加到一个新的 C++ 项目中时......”
这可能行不通。如果此代码位于 C++ 项目中的 .cpp 中,它将无法工作。
cusp 是一个建立在thrust之上的模板库,它是建立在CUDA之上的,所以cusp代码必须由nvcc
编译,即它必须在一个CUDA项目中VS,不是一个普通的C++项目。
所以回到在 VS 中使用 CUDA 项目作为您的尖点代码。
【讨论】:
天哪……根本就没有办法吗?甚至不能从中创建静态或动态库并将其链接到项目? 尖点代码需要nvcc
编译。这将在 CUDA 项目中以相对简单的方式发生。是的,如果您创建一个静态或动态库,这可能是另一种方式,尽管静态库可能仍会带来一些挑战。 Ceratinly 一个 DLL 是可行的。您还可以通过 C++ 项目中的包装函数调用您的 cusp 代码,即创建一个包含多个项目的 VS 解决方案,其中一个是 C++,另一个是 CUDA 项目。
亲爱的罗伯特,非常感谢你,你建议的第二种方法似乎很简单,但是你能给我看一个关于创建包含尖点的 DLL 的教程或插图吗?感谢您宝贵的时间
不应该有任何特定于 cusp 的内容,即如果您搜索如何制作 CUDA DLL,您会得到很多想法,例如 this one on SO 这很简单,对于这个 @ 987654322@
非常感谢你救了我的命谢谢谢谢。以上是关于在 Visual Studio C++ 项目中使用 cusp的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 2017 中使用 64 位 Visual C++ 工具集
无法在 Visual Studio 2010 中构建 C++ 项目
使用 C++ 在 Visual Studio 2010 中进行 UI 编程
如何在 Visual Studio (C++) 项目向导中添加/重命名配置?