gpt4 book ai didi

c - 如何从c文件调用放置在.cu文件中的C函数?

转载 作者:行者123 更新时间:2023-11-30 17:00:44 24 4
gpt4 key购买 nike

我需要从 C 文件(.c)调用放置在 cuda(.cu)文件中的 C 函数。我的层次结构看起来像这样。

main.c

#include <stdio.h>

#include "dbgHelpers.h"
#include "arffReader.h"
#include "CPU_k_means.h"
#include "CUDA_k_means.h"

#include "defines.h"

int main() {
//actions
uint cudaTime = runCudaKMeans(h_objects, objectsNum, parametersNum, clustersNum, repeatesNum, streamsNum);
//actions
return 0;
}

CUDA_k_means.cu

#include "CUDA_k_means.h"

#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>

extern "C" {
#include "dbgHelpers.h"
}

__constant__ uint d_CLUST_NUM;
__constant__ uint d_OBJ_NUM;
__constant__ uint d_PARAMS_NUM;
__constant__ uint d_OBJ_PER_STREAM;
__constant__ uint d_OBJ_FOR_LAST_STREAM;

extern __shared__ uint sharedData[];

__global__ void calcDistances(ptype* d_objects, ptype* d_clustersCenters, ptype* d_distances)
{
//algorithm
}

__global__ void clusterize(ptype* d_distances, uint* d_clustersMap)
{
//algorithm
}

//and more kernels

uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum) {
//algorithm
calcDistances<<32, 32>>();
//and so on
}

CUDA_k_means.h

#ifndef CUDA_K_MEANS_H_
#define CUDA_K_MEANS_H_

#include "defines.h"

uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum);

#endif

我无法正确链接它。 NSight 返回此错误。

/usr/local/cuda-7.5/bin/nvcc --cudart static --relocatable-device-code=false -gencode arch=compute_20,code=compute_20 -gencode arch=compute_20,code=sm_21 -link -o  "lab5"  ./CPU_k_means.o ./CUDA_k_means.o ./arffReader.o ./dbgHelpers.o ./main.o   
./main.o: In function `main':
main.c:(.text.startup+0x8c): undefined reference to `runCudaKMeans'
collect2: error: ld returned 1 exit status
make: *** [lab5] Error 1

不知道该怎么办。我尝试了“extern C”的不同组合,但没有成功。这可能吗?

最佳答案

终于找到解决办法了。

在 CUDA_k_means.cu 文件中。

第一行是

#include "CUDA_k_means.h"

需要删除。

在同一个文件中,函数需要被标记为“extern”C”,所以它看起来像。

extern "C" uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum)

在 CUDA_k_means.h 中,如果您不想将其包含在 main.c 函数声明中,则必须如下所示

extern uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum)

无法完全解释它是如何工作的。如果有人知道,可以在这里解释一下。

关于c - 如何从c文件调用放置在.cu文件中的C函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37375604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com