Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Cuda兼容GPU时,Cuda程序无法提供正确的输出_Cuda_Gpu - Fatal编程技术网

使用Cuda兼容GPU时,Cuda程序无法提供正确的输出

使用Cuda兼容GPU时,Cuda程序无法提供正确的输出,cuda,gpu,Cuda,Gpu,我从中找到了以下程序 不幸的是,我不能复制粘贴到这里,因为代码变得凌乱 它以数字向量作为输入,然后将向量乘以自身作为输出,我在安装在计算机上的仿真器上运行它,它给出以下输出: 0 0.000000 1 1.000000 2 4.000000 3 9.000000 4 16.000000 5 25.000000 6 36.000000 7 49.000000 8 64.000000 9 81.000000 但是,如果我决定在一台运行debian并具有cuda兼容gpu的远程计算机上运行它,请输入

我从中找到了以下程序

不幸的是,我不能复制粘贴到这里,因为代码变得凌乱

它以数字向量作为输入,然后将向量乘以自身作为输出,我在安装在计算机上的仿真器上运行它,它给出以下输出:

0 0.000000
1 1.000000
2 4.000000
3 9.000000
4 16.000000
5 25.000000
6 36.000000
7 49.000000
8 64.000000
9 81.000000
但是,如果我决定在一台运行debian并具有cuda兼容gpu的远程计算机上运行它,请输入

nvcc test.cu -lcudart -o test
./test
它给我以下输出

0 0.000000
1 1.000000
2 2.000000
3 3.000000
4 4.000000
5 5.000000
6 6.000000
7 7.000000
8 8.000000
9 9.000000

为什么会发生这种情况?提前谢谢你

问题是代码没有错误检查,远程计算机有问题。添加到代码中(这并不难做到),重新运行它,然后看看会发生什么。如果您仍然有问题,请向我们报告

以下是通过错误检查适当修改的代码:

// example1.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <cuda.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)

// Kernel that executes on the CUDA device
__global__ void square_array(float *a, int N)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx<N) a[idx] = a[idx] * a[idx];
}

// main routine that executes on the host
int main(void)
{
  float *a_h, *a_d;  // Pointer to host & device arrays
  const int N = 10;  // Number of elements in arrays
  size_t size = N * sizeof(float);
  a_h = (float *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  cudaCheckErrors("cudaMalloc fail");
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) a_h[i] = (float)i;
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  cudaCheckErrors("cudaMemcpy 1 fail");
  // Do calculation on device:
  int block_size = 4;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  square_array <<< n_blocks, block_size >>> (a_d, N);
  cudaDeviceSynchronize();
  cudaCheckErrors("kernel fail");
  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
  cudaCheckErrors("cudaMemcpy 2 fail");
  // Print results
  for (int i=0; i<N; i++) printf("%d %f\n", i, a_h[i]);
  // Cleanup
  free(a_h); cudaFree(a_d);

}
//example1.cpp:定义控制台应用程序的入口点。
//
#包括
#包括
#定义cudaCheckErrors(msg)\
做{\
cudaError\u t\u err=cudaGetLastError()\
如果(_err!=cudaSuccess){\
fprintf(标准,“致命错误:%s(%s位于%s:%d)\n”\
msg,cudaGetErrorString(_err)\
__文件(行)\
fprintf(stderr,“***失败-中止\n”)\
出口(1)\
} \
}而(0)
//在CUDA设备上执行的内核
__全局数组(浮点*a,整数N)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;

如果(idx问题是代码没有错误检查,并且远程计算机有问题。添加到代码中(这并不难),重新运行它,然后查看发生了什么。如果仍然有问题,请返回报告

以下是通过错误检查适当修改的代码:

// example1.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <cuda.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)

// Kernel that executes on the CUDA device
__global__ void square_array(float *a, int N)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx<N) a[idx] = a[idx] * a[idx];
}

// main routine that executes on the host
int main(void)
{
  float *a_h, *a_d;  // Pointer to host & device arrays
  const int N = 10;  // Number of elements in arrays
  size_t size = N * sizeof(float);
  a_h = (float *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  cudaCheckErrors("cudaMalloc fail");
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) a_h[i] = (float)i;
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  cudaCheckErrors("cudaMemcpy 1 fail");
  // Do calculation on device:
  int block_size = 4;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  square_array <<< n_blocks, block_size >>> (a_d, N);
  cudaDeviceSynchronize();
  cudaCheckErrors("kernel fail");
  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
  cudaCheckErrors("cudaMemcpy 2 fail");
  // Print results
  for (int i=0; i<N; i++) printf("%d %f\n", i, a_h[i]);
  // Cleanup
  free(a_h); cudaFree(a_d);

}
//example1.cpp:定义控制台应用程序的入口点。
//
#包括
#包括
#定义cudaCheckErrors(msg)\
做{\
cudaError\u t\u err=cudaGetLastError()\
如果(_err!=cudaSuccess){\
fprintf(标准,“致命错误:%s(%s位于%s:%d)\n”\
msg,cudaGetErrorString(_err)\
__文件(行)\
fprintf(stderr,“***失败-中止\n”)\
出口(1)\
} \
}而(0)
//在CUDA设备上执行的内核
__全局数组(浮点*a,整数N)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;

如果(idxFirst thouht是卡的兼容性可能存在双浮/双浮问题。在每种情况下,您是运行浮点数还是双浮点数?我相信随着CUDA体系结构的成熟,浮点数/双浮点数功能会发生一些变化。该URL上的程序不会执行任何错误检查。我建议为所有CUDA API ca添加错误检查lls和内核启动。通过查看代码,计算中涉及的数组是一个浮点变量。首先,可能存在与卡的兼容性有关的双浮点/浮点问题。您是在每种情况下运行浮点还是双浮点?我相信随着CUDA体系结构的成熟,浮点/双浮点功能会发生一些变化。程序t该URL不进行任何错误检查。我建议为所有CUDA API调用和内核启动添加错误检查。通过查看代码,计算中涉及的数组是一个浮点变量,因为我是CUDA新手,这将需要一些时间,我稍后会报告!谢谢!我添加了经过错误检查修改的代码,以便为您提供一个示例。您现在需要做的就是复制和粘贴。您好,非常感谢您的代码,我收到了以下错误:致命错误:cudaMalloc失败(测试时未检测到支持CUDA的设备。cu:34)***失败-中止这很奇怪,cuda已安装,但找不到支持cuda的gpu。我可能必须联系管理员!!可能他在错误的节点上为我创建了一个帐户。再次感谢!这实际上是一个权限问题。因此,如果您有类似的问题,请检查您的用户是否有权限在t上运行程序他是GPU。因为我是CUDA的新手,这需要一些时间,我会稍后再报告!谢谢!我添加了经过错误检查修改的代码来给你一个例子。你现在需要做的就是复制和粘贴。你好,非常感谢你的代码,我得到了以下错误:致命错误:cudaMalloc失败(测试时未检测到支持CUDA的设备。cu:34)***失败-中止这很奇怪,cuda已安装,但找不到支持cuda的gpu。我可能必须联系管理员!!可能他在错误的节点上为我创建了一个帐户。再次感谢!这实际上是一个权限问题。因此,如果您有类似的问题,请检查您的用户是否有权限在t上运行程序他是GPU。