首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在gprbuild中使用nvcc?

如何在gprbuild中使用nvcc?
EN

Stack Overflow用户
提问于 2021-03-09 13:34:20
回答 1查看 124关注 0票数 3

我在Ada中有一个代码,它必须使用CUDA而不用Ada绑定。因此,我创建了一个接口,允许Ada程序调用C代码。现在我想编译它。

如何告诉gprbuild不要使用gcc来编译nvcc的.cu文件?如果不可能,也许我必须使用nvcc生成对象,然后将它们与ada代码链接起来?你会怎么做?

编辑:使用Simon Wright提供的链接,我创建了这个gpr文件:

代码语言:javascript
复制
project Cuda_Interface is
  for Languages use ("Ada", "Cuda");

  for Source_Dirs use ("src");
  for Object_Dir  use "obj";
  for Exec_Dir    use ".";

  for Main use ("cuda_interface.adb");

  for Create_Missing_Dirs use "True";

  package Naming is
    for Body_Suffix("Cuda") use ".cu";
    for Spec_Suffix("Cuda") use ".cuh";
  end Naming;

  package Compiler is
    for Driver("Cuda") use "nvcc";
    for Leading_Required_Switches("Cuda") use ("-c");
  end Compiler;

  package Linker is
    for Default_Switches("Ada") use ("-L/usr/local/cuda/lib64", "-lcuda", "-lcudart", "-lm");
  end Linker;
end Cuda_Interface;

编译工作良好,但链接器返回此错误:

代码语言:javascript
复制
/usr/bin/ld : cuda_interface.o : in the function « _ada_cuda_interface » :
cuda_interface.adb:(.text+0x3a5) : undefined reference to « inter_add_two »
collect2: error: ld returned 1 exit status
gprbuild: link of cuda_interface.adb failed

cuda_interface.adb:

代码语言:javascript
复制
with Ada.Text_IO;   use Ada.Text_IO;

procedure Cuda_Interface is
  type Index is range 1 .. 5;
  type Element_Type is new Natural;

  type Array_Type is array (Index) of Element_Type;

  procedure Inter_Add_Two(Arr : in out Array_Type; Length : Index)
    with
      Import        => True,
      Convention    => C,
      External_Name => "inter_add_two";

  A : Array_Type := (1, 2, 3, 4, 5);
begin
  for I in Index loop
    Put_Line("Value at " 
            & Index'Image(I)
            & " is "
            & Element_Type'Image(A(I)));
  end loop;
  New_Line;

  Inter_Add_Two(A, Index'Last);

  for I in Index loop
    Put_Line("Value at " 
            & Index'Image(I)
            & " is "
            & Element_Type'Image(A(I)));
  end loop;
end Cuda_Interface;

kernel.cuh

代码语言:javascript
复制
#ifndef __KERNEL_CUH__
#define __KERNEL_CUH__

#include <cuda.h>

__global__ void kernel_add_two(unsigned int *a, unsigned int length);
void inter_add_two(unsigned int *a, unsigned int length);

#endif // __KERNEL_CUH__

kernel.cu

代码语言:javascript
复制
#include "kernel.cuh"
#include <math.h>

#define THREADS_PER_BLOCK (1024)


__global__ void kernel_add_two(unsigned int *a, unsigned int length)
{
  unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x;
  if (tid < length) a[tid] += 2;
}

void inter_add_two(unsigned int *a, unsigned int length)
{
  unsigned int block_number = ceil(((float)length) / THREADS_PER_BLOCK);
  unsigned int *d_a;
  
  cudaMalloc((void**)&d_a, sizeof(unsigned int) * length);
  cudaMemcpy(d_a, a, sizeof(unsigned int) * length, cudaMemcpyHostToDevice);

  kernel_add_two<<<block_number, THREADS_PER_BLOCK>>>(d_a, length);
  
  cudaMemcpy(a, d_a, sizeof(unsigned int) * length, cudaMemcpyDeviceToHost);
  cudaFree(d_a);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 04:59:58

感谢这些评论,我成功地编译并运行了一个名为C代码的Ada程序,该程序调用CUDA代码。以下是我编辑的文件:

kernel.cuh

代码语言:javascript
复制
#ifndef __KERNEL_CUH__
#define __KERNEL_CUH__

#include <cuda.h>

void *__gxx_personality_v0;

extern "C"
{
  __global__ void kernel_add_two(unsigned int *a, unsigned int length);
  void inter_add_two(unsigned int *a, unsigned int length);
}

#endif // __KERNEL_CUH__

cuda_interface.gpr

代码语言:javascript
复制
project Cuda_Interface is
  for Languages use ("Ada", "Cuda");

  for Source_Dirs use ("src");
  for Object_Dir  use "obj";
  for Exec_Dir    use ".";

  for Main use ("cuda_interface.adb");

  for Create_Missing_Dirs use "True";

  package Naming is
    for Body_Suffix("Cuda") use ".cu";
    for Spec_Suffix("Cuda") use ".cuh";
  end Naming;

  package Compiler is
    for Driver("Cuda") use "nvcc";
    for Leading_Required_Switches("Cuda") use ("-c");
  end Compiler;

  package Linker is
    for Default_Switches("Ada") use ("-L/usr/local/cuda/lib64", "-lcuda", "-lcudart", "-lcudadevrt", "-lm");
  end Linker;
end Cuda_Interface;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66547906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档