CUDA三环

CUDA三环,c,for-loop,cuda,C,For Loop,Cuda,我是CUDA的新手,我正在努力将一个C代码转换成CUDA C,它构建成功了,但一直崩溃。三环函数肯定是错误的,我不知道应该更改什么 函数调用: for (z=0;z<=max;z++) { correlationsum=coefficient(x, n, dim, z); printf("result for epsilon %d returns %d\n", z, correlation_sum); } for(z=0;z所以“崩溃”是一

我是CUDA的新手,我正在努力将一个C代码转换成CUDA C,它构建成功了,但一直崩溃。三环函数肯定是错误的,我不知道应该更改什么

函数调用:

for (z=0;z<=max;z++)    
    {
    correlationsum=coefficient(x, n, dim, z);
    printf("result for epsilon %d returns %d\n", z, correlation_sum);
    }    
for(z=0;z所以“崩溃”是一个seg故障。seg故障是主机代码中的问题,而不是内核代码中的问题(尽管它可能在CUDA API的使用中)

您的代码有各种各样的问题

  • 这可能会引起麻烦:

    int x[40000]
    
    这将创建一个基于堆栈的大型分配。相反,我建议执行动态分配:

    int *x = (int *)malloc(40000*sizeof(int));
    
    动态分配具有更高的大小限制

  • 从您的内核使用情况可以清楚地看出,您打算使用整个
    x
    向量。因此,设备上的
    dux
    分配不正确:

    cudaMalloc((void **)&d_x, sizeof(int));
    
    我们在设备上需要与主机上相同的大小分配:

    cudaMalloc((void **)&d_x, 40000*sizeof(int));
    
  • 对应于2,您可能希望将整个
    x
    向量复制到设备(因为您的代码没有显示
    x
    的初始化,所以不太清楚),并且您在此处错误地获取了
    x
    的地址,但
    x
    已经是一个指针:

    cudaMemcpy(d_x, &x, sizeof(int), cudaMemcpyHostToDevice);
    
    所以我们想要这样的东西:

    cudaMemcpy(d_x, x, 40000*sizeof(int), cudaMemcpyHostToDevice);
    
  • 您的其他内核参数似乎是标量参数。您处理这些参数的方式也大多不正确:

    __global__ void coefficient(int *vctr, int numberofpoints, int coefficient_row, int epsilon, int *numbofpairs){
    
    对于像上面指定的
    numberofpoints
    这样的参数(单向传递到函数),我们只需在调用内核时按值传递所需的主机数量,就像使用普通C函数一样。因此,此内核调用不正确(即使它看起来是编译的):


    请注意,我没有对您的内核代码进行任何更改。

    您应该始终这样做。此外,您应该提供一个。欢迎这样做。尽管您在工作和这个问题上付出了一些努力,但您的代码中缺少了值。我们不知道循环的限制,也不知道线程的数量,如果有另一个内存分配可以ld使整个程序崩溃…你应该提供一个。当你开始使用CUDA时,在你的代码中添加适当的CUDA错误检查。如果你看到反对票,不要气馁。改进你的问题以获得好的和高质量的答案。谢谢你们,我已经编辑了我的帖子并提供了一个MCVE(如果我做对了,仍在学习英语)。很抱歉让我说不清楚。x是一个数字数组(从文件中读取),最多40000个。因此,我需要将整个数组传递给设备,内核调用将如何更改?内核调用根本不需要更改。通过
    d_x
    传递的
    x
    向量是完整传递的(所有40000个元素)对于内核,在我的代码中。好的,明白了。最后一件事是内核本身-j,j和k。j和k的值看起来根本没有变化,我猜blockId.x/y/z*blockDim.x/y/z+threadIdx.x/y/z不是正确的解决方案?是的,你正在启动一个一维网格和一维threadblock,所以
    j
    k
    总是b由于我不知道你在内核中试图计算什么,我不能说什么是有意义的。崩溃问题已经解决了,对吗?如果你有新问题,我建议你问一些新问题。
    cudaMemcpy(d_x, x, 40000*sizeof(int), cudaMemcpyHostToDevice);
    
    __global__ void coefficient(int *vctr, int numberofpoints, int coefficient_row, int epsilon, int *numbofpairs){
    
    coefficient << <1, THREADS >> >(d_x, *d_n, *d_dim, *d_z, d_numbofpairs);
    
    coefficient << <1, THREADS >> >(d_x, n, dim, z, d_numbofpairs);
    
    $ cat t724.cu
    #include <stdio.h>
    
    #define cudaCheckErrors(msg) \
        do { \
            cudaError_t __err = cudaGetLastError(); \
            if (__err != cudaSuccess) { \
                fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                    msg, cudaGetErrorString(__err), \
                    __FILE__, __LINE__); \
                fprintf(stderr, "*** FAILED - ABORTING\n"); \
                exit(1); \
            } \
        } while (0)
    
    
    #define THREADS 1024
    
    __global__ void coefficient(int *vctr, int numberofpoints, int coefficient_row, int epsilon, int *numbofpairs){
            int i = blockIdx.x * blockDim.x + threadIdx.x;
            int j = blockIdx.y * blockDim.y + threadIdx.y;
            int k = blockIdx.z * blockDim.z + threadIdx.z;
            int sum;
            numbofpairs = 0;
            int sq_epsilon = epsilon*epsilon;
    
    
            if (i <= numberofpoints - coefficient_row)
            {
                sum = 0;
                if (j <= numberofpoints + 1 - coefficient_row)
                {
                    if (k < coefficient_row)
                        sum = sum + (vctr[i + k] - vctr[j + k])*(vctr[i + k] - vctr[j + k]);
                    if (sum < sq_epsilon){
                        numbofpairs++;
                        sum = 0;
        }}}}
    
    int main()
    {
      int n, dim, max, z;
      int  *d_x, *d_numbofpairs;
      int correlation_sum = 0;
      int *x = (int *)malloc(40000*sizeof(int));
      if (x == NULL) {printf("malloc fail\n"); return -1;}
        n=10;
        max=10;
        dim=3;
    
        cudaMalloc((void **)&d_x, sizeof(int));
        cudaCheckErrors("cudaMalloc 1 fail");
        cudaMalloc((void **)&d_numbofpairs, sizeof(int));
        cudaCheckErrors("cudaMalloc 2 fail");
        cudaMemcpy(d_x, x, sizeof(int), cudaMemcpyHostToDevice);
        cudaCheckErrors("cudaMemcpy 1 fail");
    
        for (z = 0; z <= max; z++)
        {
            coefficient << <1, THREADS >> >(d_x, n, dim, z, d_numbofpairs);
            cudaMemcpy(&correlation_sum, d_numbofpairs, sizeof(int), cudaMemcpyDeviceToHost);
            cudaCheckErrors("cudaMemcpy 2/kernel fail");
            printf("result for epsilon %d returns %d\n", z, correlation_sum);
        }
        cudaFree(d_x);
        cudaFree(d_numbofpairs);
        return 0;
    }
    $ nvcc -o t724 t724.cu
    $ ./t724
    result for epsilon 0 returns 3
    result for epsilon 1 returns 3
    result for epsilon 2 returns 3
    result for epsilon 3 returns 3
    result for epsilon 4 returns 3
    result for epsilon 5 returns 3
    result for epsilon 6 returns 3
    result for epsilon 7 returns 3
    result for epsilon 8 returns 3
    result for epsilon 9 returns 3
    result for epsilon 10 returns 3
    $