直接问题: 如何在visual studio 2010中创建一个简单的hello world CUDA项目?
背景: 我写过CUDA内核.我非常熟悉Visual Studio 2005中的.vcproj文件 - 手动调整了几个.在VS 2005中,如果我想构建一个CUDA内核,我会添加一个自定义构建规则,然后显式定义nvcc调用以构建文件.
我已经迁移到Win 7和VS 2010,因为我真的想尝试nSight.我安装了nSight 1.5.但这就是我完全迷失的地方.如果我像以前一样继续,nvcc报告它只支持msvc 8.0和9.0.但该网站明确表示它支持VS 2010.
我在其他地方读到了我需要安装VS 2008(msvc 9.0) - 我的话.现在这样做.
但我猜测,我的问题至少部分来自自产自定义生成工具的规格干. 一些 网站谈论添加*.rules文件添加到构建,但我已经收集,这是只适用于VS 2008在"构建自定义"我看到CUDA 3.1和3.2,但是当我添加内核他们AREN项目没有建成. 另一个网站宣称,关键是三个文件:Cuda.props Cuda.xml Cuda.targets,但它并没有说如何或在哪里添加这些文件-或者更确切地说,我会赌我只是不明白的说明在网站上引用.
因此,没有人知道如何创建在VS 2010中一个简单的项目,该项目构建了一个CUDA内核-使用无论是nSight 1.5设置或NvCudaRuntimeApi.v3.2.rules文件所附带CUDA 3.2 RC?
提前致谢!我会提供赏金,但我总共得到65分.
我正在使用nVidia的CUDA C进行一些编程.我使用Visual Studio 2008作为我的开发环境,我遇到了一些链接的麻烦,我想知道是否有人知道修复它的方法或者有同样的问题并且可以提供一个办法.
我的程序由3个文件组成.1个头文件(stuff.h),1个C源文件(stuff.c)和1个CUDA C文件(main.cu).(名字是假的,但这只是为了说明这一点).
现在stuff.h/stuff.c定义/实现我从main.cu内部调用的一些辅助函数.
我正在使用视觉工作室2008和来自nVidia GPU计算SDK的Cuda.rules,所有内容编译都很好但是......当涉及将所有文件链接在一起时,它失败了.看来,stuff.h中定义的所有函数(以及在stuff.c中实现的)都没有被正确链接,因为它们被标记为"未解析的外部符号".
可能的原因是什么?我该如何解决这个问题?
非常感谢,
ExtremeCoder
好的,所以我设法让它全部编译.似乎我所要做的就是将实现文件的扩展名从.c更改为.cpp(意味着编译为c ++,而编译为c则不行!).
可能是什么导致了这个?我宁愿将所有内容保存为.c而不是.cpp(因为这实际上是C代码...
有什么指针吗?
这篇文章与我之前的帖子非常类似:如何将CUDA代码分成多个文件 我恐怕我犯了一个大错,我实际上要求在那里试图纠正它会太混乱.
我基于CUDA SDK中的cppIntegration示例松散地使用此代码.
我希望有一个main.cpp与我的main()函数,并让它调用一个单独的.cu文件在GPU上做一些工作.在单独的.cu文件中,我希望它能够调用驻留在另一个.cu文件中的内核代码.我设想了三个文件:Main.cpp,KernelWrapper.cu和MyKernel.cu.出于测试目的,Main.cpp除了调用RunTest()位于KernelWrapper.cu中的函数之外什么都不做.该RunTest()方法执行TestDevice(int *deviceArray)位于MyKernel.cu中的内核
Main.cpp的:
#include <iostream>
void RunTest(); //forward declaration???
int main( int argc, char** argv)
{
RunTest();
std::cout << "blah\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
KernelWrapper.cu:
#include <iostream>
__global__ void TestDevice(int *deviceArray); //forward declaration
void RunTest()
{
int* hostArray;
int* deviceArray;
const int arrayLength = 16;
const unsigned int memSize = sizeof(int) * arrayLength;
hostArray = (int*)malloc(memSize);
cudaMalloc((void**) &deviceArray, memSize);
std::cout << "Before device\n";
for(int i=0;i<arrayLength;i++)
{
hostArray[i] = …Run Code Online (Sandbox Code Playgroud) 我尝试使用nvcc(CUDA 5.0 RC)编译以下程序(main.cu):
#include <Eigen/Core>
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "Pure CUDA" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到了一堆警告和错误,我只能使用nvcc而不是Microsoft编译来解释.
这个假设是对的吗?有没有办法用nvcc编译Eigen?(我实际上不想将Eigen矩阵转移到GPU,只是访问他们的成员)?
如果用nvcc编译Eigen不起作用,是否有一个很好的指南/教程,关于分离主机和设备代码的聪明方法?
我正在使用CUDA 5.0 RC,Visual Studio 2008,Eigen 3.0.5.要编译我同时使用的.cu文件,CUDA中包含的规则文件,以及CMake生成的自定义构建步骤.使用CUDA规则文件,我以build capability 3.0为目标.
谢谢你的建议.
PS:如果我使用主机编译器编译相同的代码,它可以很好地工作.
当我想编译我的程序(使用 Cusparse)时,出现了以下几行:
tmp/tmpxft_00001048_00000000-13_matvec.o:在函数main':
tmpxft_00001048_00000000-1_matvec.cudafe1.cpp:(.text+0x6d5): undefined reference tocusparseCreate中
同样的结果不仅适用于 cusparseCreate,也适用于 cusparseCreateMatDescr、cusparseSetMatType、cusparseSetMatIndexBase、cusparseXcoo2csr、cusparseDsctr、cusparseDcsrmv_v2、cusparseDestroyMatDescr 和 cusparseDestroy。这是什么意思?