Я искал интернет в поисках ответа на этот вопрос, но не смог найти ни одного.Я установил CUDA 3.2 SDK (и, только сейчас, CUDA 4.0 RC), и все, кажется, работает нормально после долгих часов дурачения с включенными каталогами, NSight и всем остальным.Ну, кроме одного: он продолжает выделять оператор <<< >>>
как ошибку.Только на VS2010 - не на VS2008.
На VS2010 я также получаю несколько предупреждений следующего вида:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xdebug(109): warning C4251: 'std::_String_val<_Ty,_Alloc>::_Alval' : class 'std::_DebugHeapAllocator<_Ty>' needs to have dll-interface to be used by clients of class 'std::_String_val<_Ty,_Alloc>'
Обновление: Если я попытаюсь включить точку входа в файл .cpp
, которыйвызывает ядро CUDA, вместо записи main()
в файл .cu
, как я это делал, оператор фактически помечается как ошибка, помимо ее выделения!То же самое происходит с VS2008.
Кто-нибудь знает, как это можно исправить?
Обновление 2: Вот код.Файл main.cpp
:
#include "kernel.cu"
int main()
{
doStuff();
return 0;
}
и файл .cu
:
#include <iostream>
#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cutil_inline.h>
#include <time.h>
using namespace std;
#define N 16
__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N])
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
if (i < N && j < N)
C[i][j] = A[i][j] + B[i][j];
}
int doStuff()
{
dim3 threadsPerBlock(8, 8);
dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
float A[N][N], B[N][N], C[N][N];
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
{
A[i][j] = 0;
B[i][j] = 0;
C[i][j] = 0;
}
clock_t start = clock();
MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
clock_t end = clock();
cout << "Took " << float(end - start) << "ms to work out." << endl;
cin.get();
return 0;
}
Обновление 3: Хорошо, я (идиотски) включил CUDAкод в файле .cpp
, поэтому он не может быть скомпилирован.Теперь у меня есть CUDA 4.0 и работает на VS2010, но я все еще получаю несколько предупреждений, подобных описанным выше.