2014-10-07 49 views
0

我正在编译vs2010上的cuda 5.5项目。我需要使用mpir库,因为我的项目包含大量数据。当我使用MPIR指令时,会出现此错误。我不知道我该如何解决它。 该程序使用mpir函数添加数组A和数组B.不允许从全局函数调用主机函数

__global__ 
void vecAdd(mpz_t *A,mpz_t *B,mpz_t *C,int N) 
{ 
    int i = threadIdx.x + blockDim.x * blockIdx.x; 
    if(i<N) 
    mpz_add(C[i],A[i],B[i]); 
} 

int main() 
{ 
    mpz_t *h_A; 
    h_A=(mpz_t*)malloc(5*sizeof(mpz_t)); 
    mpz_array_init(h_A[0],5,16); 
    mpz_set_si(h_A[0],1); 
    mpz_set_si(h_A[1],2); 
    mpz_set_si(h_A[2],3); 
    mpz_set_si(h_A[3],4); 
    mpz_set_si(h_A[4],5); 

    mpz_t *h_B; 
    h_B=(mpz_t*)malloc(5*sizeof(mpz_t)); 
    mpz_array_init(h_B[0],5,16); 
    mpz_set_si(h_B[0],1); 
    mpz_set_si(h_B[1],2); 
    mpz_set_si(h_B[2],3); 
    mpz_set_si(h_B[3],4); 
    mpz_set_si(h_B[4],5); 
    mpz_t *h_C; 
    h_C=(mpz_t*)malloc(5*sizeof(mpz_t)); 
    mpz_array_init(h_C[0],5,16); 

    int N=5; 
    int size=N*sizeof(mpz_t); 

    mpz_t *d_A; 
    d_A=(mpz_t*)malloc(5*sizeof(mpz_t)); 
    mpz_array_init(d_A[0],5,16); 

    mpz_t *d_B; 
    d_B=(mpz_t*)malloc(5*sizeof(mpz_t)); 
    mpz_array_init(d_B[0],5,16); 

    mpz_t *d_C; 
    d_C=(mpz_t*)malloc(5*sizeof(mpz_t)); 
    mpz_array_init(d_C[0],5,16); 

    cudaMalloc((void**)&d_A,size); 
    cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice); 
    cudaMalloc((void**)&d_B,size); 
    cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice); 
    cudaMalloc((void**)&d_C,size); 

    vecAdd<<<ceil(N/512.0),512>>>(d_A,d_B,d_C,N); 

    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost); 

    cudaFree(d_A); 
    cudaFree(d_B); 
    cudaFree(d_C); 

    for(int i=0;i<5;i++) 
    { 
     mpz_out_str(stdout,10,h_C[i]); 
     printf("\n"); 
    } 

    return 0; 
} 
+2

请缩进您的代码。 – 2014-10-07 11:32:46

+0

@Angew哦,好的 - 记得它错了。抱歉。 – Rup 2014-10-07 11:51:44

+1

如果所有你想要做的是大整数加法,那么[这个问题/答案](http://stackoverflow.com/questions/12957116/large-integer-addition-with-cuda)可能是有趣的。 [CUMP](http://www.hpcs.cs.tsukuba.ac.jp/~nakayama/cump/)库使用CUDA处理扩展精度浮点。它主要是一个浮点库,但是在那里可能有一个大整数的基础。 – 2014-10-07 15:37:46

回答

2

您必须明白,可能从设备调用的函数必须编译为设备代码。在函数声明中放置__device__将使其可从设备端使用。

但是,由于mpz_add来自MPIR库,它不是用CUDA兼容性功能(据我所知),因此您运气不好。我建议你找到任意精度数字的GPU实现。