首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA 5.0: CUBIN和CUBLAS_device,计算能力3.5

CUDA 5.0: CUBIN和CUBLAS_device,计算能力3.5
EN

Stack Overflow用户
提问于 2013-03-14 10:55:08
回答 1查看 2.8K关注 0票数 3

我正在尝试编译一个内核,它使用动态并行性将CUBLAS运行到一个cubin文件中。当我试图使用以下命令编译代码时

代码语言:javascript
复制
nvcc -cubin -m64 -lcudadevrt -lcublas_device -gencode arch=compute_35,code=sm_35 -o test.cubin -c test.cu

我得到了ptxas fatal : Unresolved extern function 'cublasCreate_v2

如果我添加-rdc=true编译选项,它会编译得很好,但是当我尝试使用cuModuleLoad加载模块时,我会得到错误500: CUDA_ERROR_NOT_FOUND。从cuda.h:

代码语言:javascript
复制
/**
 * This indicates that a named symbol was not found. Examples of symbols
 * are global/constant variable names, texture names, and surface names.
 */
CUDA_ERROR_NOT_FOUND                      = 500,

内核代码:

代码语言:javascript
复制
#include <stdio.h>
#include <cublas_v2.h>
extern "C" {
__global__ void a() {
    cublasHandle_t cb_handle = NULL;
    cudaStream_t stream;
    if( threadIdx.x == 0 ) {
        cublasStatus_t status = cublasCreate_v2(&cb_handle);
        cublasSetPointerMode_v2(cb_handle, CUBLAS_POINTER_MODE_HOST);
        if (status != CUBLAS_STATUS_SUCCESS) {
            return;
        }
        cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking);
        cublasSetStream_v2(cb_handle, stream);
    }
    __syncthreads();
    int jp;
    double A[3];
    A[0] = 4.0f;
    A[1] = 5.0f;
    A[2] = 6.0f;
    cublasIdamax_v2(cb_handle, 3, A, 1, &jp );
}
}

注意:A的作用域是本地的,因此给cublasIdamax_v2的指针处的数据是未定义的,因此jp在这段代码中或多或少是一个随机值。正确的方法是将A存储在全局内存中。

主机代码:

代码语言:javascript
复制
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime_api.h>

int main() {
    CUresult error;
    CUdevice cuDevice;
    CUcontext cuContext;
    CUmodule cuModule;
    CUfunction testkernel;
    // Initialize
    error = cuInit(0);
    if (error != CUDA_SUCCESS) printf("ERROR: cuInit, %i\n", error);
    error = cuDeviceGet(&cuDevice, 0);
    if (error != CUDA_SUCCESS) printf("ERROR: cuInit, %i\n", error);
    error = cuCtxCreate(&cuContext, 0, cuDevice);
    if (error != CUDA_SUCCESS) printf("ERROR: cuCtxCreate, %i\n", error);
    error = cuModuleLoad(&cuModule, "test.cubin");
    if (error != CUDA_SUCCESS) printf("ERROR: cuModuleLoad, %i\n", error);
    error = cuModuleGetFunction(&testkernel, cuModule, "a");
    if (error != CUDA_SUCCESS) printf("ERROR: cuModuleGetFunction, %i\n", error);
    return 0;
}

主机代码是使用nvcc -lcuda test.cpp编译的。如果我将内核替换为一个简单的内核(如下所示),然后在不使用-rdc=true的情况下编译它,那么它可以正常工作。

简单工作内核

代码语言:javascript
复制
#include <stdio.h>
extern "C" {
__global__ void a() {
    printf("hello\n");
}
}

提前感谢

  • 索伦
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-15 01:32:22

在第一种方法中,您只是缺少了-dlink

代码语言:javascript
复制
nvcc -cubin -m64 -lcudadevrt -lcublas_device -gencode arch=compute_35,code=sm_35 -o test.cubin -c test.cu -dlink

您还可以分两步完成此操作:

代码语言:javascript
复制
nvcc -m64 test.cu -gencode arch=compute_35,code=sm_35 -o test.o -dc
nvcc -dlink test.o -arch sm_35 -lcublas_device -lcudadevrt -cubin -o test.cubin
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15407257

复制
相关文章

相似问题

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