Использование cusp в проекте Visual Studio C++

Я использую cusp v.0.4.0, cuda V5.5 на VS2012 Ultimate. Я создал проект CUDA с помощью мастера создания нового проекта и добавил путь к нему в свойствах своего проекта \ VC++ Directories \ Include Directories. Я написал свой код в файле *.cu, сгенерированном VS2012, проект скомпилирован и собран успешно, но я получил ошибку R6010 при выполнении. Я решил эту проблему, изменив значение по умолчанию свойств проекта \CUDA C/C++\Device\Code Generation с compute_10,sm_10 на compute_30, sm_30, что является моей версией sm. Все работало хорошо.

Теперь я хочу использовать тот же код в проекте C++. Когда я добавил его в новый проект C++ и добавил путь к Cusp в VC++ Include Directoryies, сборка проекта завершилась с множеством синтаксических ошибок в нескольких файлах:

Ошибка 5 ошибка C2144: синтаксическая ошибка: 'void' должен предшествовать ';' c: \ users \ administrator \ downloads \ android \ cusplibrary-master \ cusplibrary-master \ cusp \ detail \ device \ spmv \ coo_flat.h 164

22 IntelliSense: ожидается ';' c:\Users\ Администратор \ 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++... "

Это, вероятно, не сработает. Если этот код находится в.cpp в проекте C++, он не будет работать.

CUSP - это библиотека шаблонов, которая построена на основе Thrust, которая построена на основе CUDA, поэтому коды CUSP должны быть скомпилированы nvccто есть он должен быть в проекте CUDA в VS, а не в обычном проекте C++.

Итак, вернитесь к использованию проекта CUDA в VS для своих кодов возврата.

Другие вопросы по тегам