cu文件怎么运行|在linux下怎么运行cuda的cu文件 怎么为他建立makefile文件请举个小程序的例子说明

⑴ linux下,.cu文件生成.a后,其他.cpp文件调用该静态链接库的问题

可以的是不是提示缺少cuda运行时环境?编译选项里面加上 -L $CUDA_HOME/lib64 -lcuda -lcudart试试 其中$CUDA_HOME是你的cuda安装目录

⑵ 如何学习cuda c

1、CUDAC编写WindowsConsoleApplication

下面我们从一个简单的例子开始学习CUDAC。

打开VS,新建一个CUDAWinApp项目,项目名称为Vector,解决方案名称为CUDADemo。依次点击“确定”,“下一步”,选择Emptyproject。点击“Finished”。这样一个CUDA的项目就建成了。

右键点击Vector项目,依次选择“添加”、“新建项”、“代码”、“CUDA”。在名称中输入要添加的文件名。如Vector.cu。然后点击添加。

下面在Vector.cu文件里实现两个向量相加的程序。

//添加系统库

#include

#include

//添加CUDA支持

#include

__global__voidVecAdd(float*A,float*B,float*C);

__host__voidrunVecAdd(intargc,char**argv);

intmain(intargc,char**argv)

{

runVecAdd(argc,argv);

CUT_EXIT(argc,argv);

}

__host__voidrunVecAdd(intargc,char**argv)

{//初始化host端内存数据

constunsignedintN=8;//向量维数

constunsignedintmemSize=sizeof(float)*N;//需要空间的字节数

float*h_A=(float*)malloc(memSize);

float*h_B=(float*)malloc(memSize);

float*h_C=(float*)malloc(memSize);

for(unsignedinti=0;i<N;i++)

{h_A[i]=i;h_B[i]=i;}

//设备端显存空间

float*d_A,*d_B,*d_C;

//初始化Device

CUT_DEVICE_INIT(argc,argv);

CUDA_SAFE_CALL(cudaMalloc((void**)&d_A,memSize));

CUDA_SAFE_CALL(cudaMalloc((void**)&d_B,memSize));

CUDA_SAFE_CALL(cudaMalloc((void**)&d_C,memSize));

CUDA_SAFE_CALL(cudaMemcpy(d_A,h_A,memSize,cudaMemcpyHostToDevice));

CUDA_SAFE_CALL(cudaMemcpy(d_B,h_B,memSize,cudaMemcpyHostToDevice));

VecAdd<<<1,N,memSize>>>(d_A,d_B,d_C);

CUT_CHECK_ERROR("Kernelexecutionfailed");

CUDA_SAFE_CALL(cudaMemcpy(h_C,d_C,memSize,cudaMemcpyDeviceToHost));

for(unsignedinti=0;i<N;i++)

{printf("%.0f",h_C[i]);}

free(h_A);free(h_B);free(h_C);

CUDA_SAFE_CALL(cudaFree(d_A));

CUDA_SAFE_CALL(cudaFree(d_B));

CUDA_SAFE_CALL(cudaFree(d_C));

}

__global__voidVecAdd(float*A,float*B,float*C)

{

//分配sharedmemory

extern__shared__floats_A[];

extern__shared__floats_B[];

extern__shared__floats_C[];

//从globalmemory拷贝到sharedmemory

constunsignedinti=threadIdx.x;

s_A[i]=A[i];

s_B[i]=B[i];

//计算

s_C[i]=s_A[i]+s_B[i];

//拷贝到globalmemory

C[i]=s_C[i];

}

由于这里不是讲CUDA编程的,关于它的编程模型已经超出了我要介绍的范围,您可以阅读《GPU高性能运算之CUDA》来获得CUDA编程模型的知识。

编译Vector项目,执行此项目后会得到图1如下输出:

图1Vector项目执行结果

2、CUDAC编写DLL模块

更多情况下的您的软件可能只是使用CUDA来实现一段程序的加速,这种情况下我们可以使用CUDAC编写DLL来提供接口。下面我们就将例1编译成DLL。

在刚才的CUDADemo解决方案目录下添加一个新的CUDA项目(当然您也可以重新建立一个解决方案)。项目名为VecAdd_dynamic。ApplicationType选为DLL,AdditionalOptions选择EmptyProject。

第一步,添加头文件,文件名最好与工程名同名,这样便于您的维护工作。这里我向项目中添加了VecAdd_dynamic.h,在此头文件中添加如下代码

#ifndef_VECADD_DYNAMIC_H_

#define_VECADD_DYNAMIC_H_

//并行计算N维向量的加法

__declspec(dllexport)voidVecAdd(float*h_A,float*h_B,float*h_C,intN);

#endif

第二步,添加cpp文件,文件名为VecAdd_dynamic.cpp,在此文件中添加如下代码

#include

#include"VecAdd_dynamic.h"

#ifdef_MANAGED

#pragmamanaged(push,off)

#endif

BOOLAPIENTRYDllMain(HMODULEhMole,DWORDul_reason_for_call,LPVOIDlpReserved)

{

returnTRUE;

}

#ifdef_MANAGED

#pragmamanaged(pop)

#endif

第三步,添加def文件,此文件的功能就是确保其它厂商的编译器能够调用此DLL里的函数。这一点非常关键,因为您的程序可能用到多个厂家的编译器。文件名为VecAdd_dynamic.def。向该文件中添加:

EXPORTS

VecAdd

第四步,添加cu文件,文件名为VecAdd_dynamic.cu。注意此文件最好直接添加到项目目录下,不要添加到源文件选项卡或其它已有的选项卡下。

在cu文件里添加如下代码,实现要导出的函数。

#include

#include

#include

#if__DEVICE_EMULATION__

boolInitCUDA(void)

{returntrue;}

#else

boolInitCUDA(void)

{

intcount=0;

inti=0;

cudaGetDeviceCount(&count);

if(count==0)

{

fprintf(stderr,"Thereisnodevice./n");

returnfalse;

}

for(i=0;i<count;i++)

{

cudaDevicePropprop;

if(cudaGetDeviceProperties(&prop,i)==cudaSuccess)

{

if(prop.major>=1)

{break;}

}

}

if(i==count)

{

fprintf(stderr,"ThereisnodevicesupportingCUDA./n");

returnfalse;

}

cudaSetDevice(i);

printf("CUDAinitialized./n");

returntrue;

}

#endif

__global__voidD_VecAdd(float*g_A,float*g_B,float*g_C,intN)

{

unsignedinti=threadIdx.x;

if(i<N)

{g_C[i]=g_A[i]+g_B[i];}

}

voidVecAdd(float*h_A,float*h_B,float*h_C,intN)

{

if(!InitCUDA())

{return;}

float*g_A,*g_B,*g_C;

unsignedintsize=N*sizeof(float);

CUDA_SAFE_CALL(cudaMalloc((void**)&g_A,size));

CUDA_SAFE_CALL(cudaMalloc((void**)&g_B,size));

CUDA_SAFE_CALL(cudaMalloc((void**)&g_C,size));

CUDA_SAFE_CALL(cudaMemcpy(g_A,h_A,size,cudaMemcpyHostToDevice));

CUDA_SAFE_CALL(cudaMemcpy(g_B,h_B,size,cudaMemcpyHostToDevice));

D_VecAdd<<<1,N>>>(g_A,g_B,g_C,N);

CUDA_SAFE_CALL(cudaMemcpy(h_C,g_C,size,cudaMemcpyDeviceToHost));

cudaFree(g_A);cudaFree(g_B);cudaFree(g_C);

}

第五步,如果您已经正确完成了以上四步,那么剩下的就只有编译,只要您用过VS,这一步就不需要我介绍了吧。成功之后,在您的解决方案文件目录下的Debug文件夹下会有一个VecAdd_dynamic.dll文件。

3、在.NET中使用CUDAC编写的DLL

下面介绍在托管程序中如何使用VecAdd_dynamic.dll。

第一步,在上面的解决方案CUDADemo下添加一个C++/CLR的Windows窗体应用程序,工程名为NETDemo(当然您也可以重新建一个解决方案,工程名也是随意的)。

第二步,在窗体上添加一个按钮,名字随意,我将它的现实文本改为“调用CUDA_DLL”,给这个按钮添加click事件。我们的代码将在这个事件里添加调用VecAdd()的程序。在窗体上添加一个文本框用来显示调用输出的结果。

第三步,代码实现。为工程NETDemo添加一个头文件,我将它命名为Win32.h,这个文件中主要是实现VecAdd()函数的导入。在此文件中添加如下代码

#pragmaonce

namespaceWin32

{

usingnamespaceSystem::Runtime::InteropServices;

[DllImport("VecAdd_dynamic.dll",EntryPoint="VecAdd",CharSet=CharSet::Auto)]

extern"C"voidVecAdd(float*h_A,float*h_B,float*h_C,intN);

}

在Form1.h中,#pragmaonce之后namespaceNETDemo之前添加以下代码。

#include"Win32.h"

#include

在button1_Click()中添加如下代码

intN=8;

float*h_A=(float*)malloc(N*sizeof(float));

float*h_B=(float*)malloc(N*sizeof(float));

float*h_C=(float*)malloc(N*sizeof(float));

for(inti=0;i<N;i++)

{h_A[i]=i;h_B[i]=i;}

Win32::VecAdd(h_A,h_B,h_C,N);

String^reslut;

for(inti=0;i<N;i++)

{reslut+=Convert::ToString(h_C[i])+",";}

this->textBox1->Text=Convert::ToString(reslut);

free(h_A);free(h_B);free(h_C);

第四步、执行NETDemo项目。点击“调用CUDA_DLL”,您会看到图3所示的结果

图3NETDemo运行结果

到现在为止您已经完全可以正确使用CUDA了。

⑶ CU文件怎么打开

TD文件,这是个迅雷占位文件,主要用来占用硬盘空间,防止文件没下完就硬盘不够而前功尽弃,CFG是配置文件,主要用来记录下载路径和网络资源.下完了应该有一个相同文件名的EXE或者RAR或者其他文件.如果用的是迅雷标准版,可以继续下载,如果用的是迷你版,对不起,你得重新下载.这是下载软件的预备文件,.td文件说明还没有下载完,是不能打开的,你可以用下载软件的断点续传功能继续下载.

⑷ 如何在cu文件中使用openmp

替你顶一下

⑸ 如何在c++中调用.cu文件

c++程序在编译后,在目标路径下会生成多个文件: Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg *.exe:是生成的可执行文件 *.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息 *.obj:是目标…

⑹ 在linux下怎么运行cuda的.cu文件 怎么为他建立makefile文件,请举个小程序的例子说明

它好像有个toolkit 之类的东西,我具体忘了,你可以去cuda的网页上下载。解压后里面有例子,包括makefile。

⑺ 在linux下怎么运行cuda的.cu文件

举个例子:add.cu编译:nvcc -o add add.cu运行:./add


赞 (0)