首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

帕斯卡cmake cuda 没有

发布网友 发布时间:2022-04-24 14:41

我来回答

3个回答

热心网友 时间:2022-04-28 09:31

在网上百度,并没有找到什么合适的教程,让我等小白着急不已。借助于GOOGLE的强大能力,发现原来cmake已经支持了cuda;于是乎,赶紧
http://www.cmake.org/
下载了最新的cmake,调用了里面的一个FindCUDA.cmake,完成了自己的第一次使用cmake编译cuda代码。具体步骤如下:

1.下载最新版的cmake(其实只要有FindCUDA.cmake这个文件,你就可以编译cuda与c或者c++混合的代码文件了)

2.因为初次测试,所以我把所有的文件都放在同一个文件夹下面:c_cpp_cu1.cu;c_cpp_cu3.cpp两个源文件加一个CMakeLists.txt文件;

3.CmakeLists.txt

[plain] view plain copy
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(test_cuda)
INCLUDE(/..../Downloads/cmake-3.2.2-Linux-x86_/share/cmake-3.2/Moles/FindCUDA.cmake)
CUDA_ADD_EXECUTABLE(tset_cuda
c_cpp_cu3.cpp
c_cpp_cu1.cu)
4.c_cpp_cu3.cpp
[html] view plain copy
#include <iostream>
using namespace std;
extern "C" int func(); //注意这里的声明
int main()
{
func();
return 0;
}
5.c_cpp_cu1.cu
[html] view plain copy
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>

#define ROWS 32
#define COLS 16
#define CHECK(res) if(res!=cudaSuccess){exit(-1);}
__global__ void Kerneltest(int **da, unsigned int rows, unsigned int cols)
{
unsigned int row = blockDim.y*blockIdx.y + threadIdx.y;
unsigned int col = blockDim.x*blockIdx.x + threadIdx.x;
if (row < rows && col < cols)
{
da[row][col] = row*cols + col;
}
}

extern "C" int func() // 注意这里定义形式
{
int **da = NULL;
int **ha = NULL;
int *dc = NULL;
int *hc = NULL;
cudaError_t res;
int r, c;
bool is_right=true;

res = cudaMalloc((void**)(&da), ROWS*sizeof(int*));CHECK(res)
res = cudaMalloc((void**)(&dc), ROWS*COLS*sizeof(int));CHECK(res)
ha = (int**)malloc(ROWS*sizeof(int*));
hc = (int*)malloc(ROWS*COLS*sizeof(int));

for (r = 0; r < ROWS; r++)
{
ha[r] = dc + r*COLS;
}
res = cudaMemcpy((void*)(da), (void*)(ha), ROWS*sizeof(int*), cudaMemcpyHostToDevice);CHECK(res)
dim3 dimBlock(16,16);
dim3 dimGrid((COLS+dimBlock.x-1)/(dimBlock.x), (ROWS+dimBlock.y-1)/(dimBlock.y));
Kerneltest<<<dimGrid, dimBlock>>>(da, ROWS, COLS);
res = cudaMemcpy((void*)(hc), (void*)(dc), ROWS*COLS*sizeof(int), cudaMemcpyDeviceToHost);CHECK(res)

for (r = 0; r < ROWS; r++)
{
for (c = 0; c < COLS; c++)
{
printf("%4d ", hc[r*COLS+c]);
if (hc[r*COLS+c] != (r*COLS+c))
{
is_right = false;
}
}
printf("\n");
}
printf("the result is %s!\n", is_right? "right":"false");

cudaFree((void*)da);
cudaFree((void*)dc);
free(ha);
free(hc);
// getchar();
return 0;
}
6.运行cmake_gui(之前学长推荐,方便,不过如果你不喜欢可以直接cmake+make)
完成,生成一大堆文件+test_cuda的可执行文件

热心网友 时间:2022-04-28 10:49

1.下载最新版的cmake(其实只要有FindCUDA.cmake这个文件,你就可以编译cuda与c或者c++混合的代码文件了)
2.因为初次测试,所以我把所有的文件都放在同一个文件夹下面:c_cpp_cu1.cu;c_cpp_cu3.cpp两个源文件加一个CMakeLists.txt文件;
3.CmakeLists.txt
4.c_cpp_cu3.cpp
5.c_cpp_cu1.cu

热心网友 时间:2022-04-28 12:23

在工程搭建时,可能会有将静态库链接成动态库的需求,如出于代码保护的角度,某些模块会发布.a扩展名的静态库,我们要将多个这样的静态库链接成一个动态库。但与直接link目标文件不同的是,ld以默认参数执行时

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com