标签: cuda

在cuda中添加char数组

我试图在cuda中添加2个char数组,但没有任何工作.我试着用:

char temp[32];
strcpy(temp, my_array);
strcat(temp, my_array_2);
Run Code Online (Sandbox Code Playgroud)

当我在内核中使用它时 - 我得到了 error : calling a __host__ function("strcpy") from a __global__ function("Process") is not allowed

在此之后,我尝试在主机中使用这些函数,而不是在内核中 - 没有错误,但是在添加之后我会得到奇怪的符号????????????????????????????????.

那么,我如何添加两个(或更多)char数组CUDA呢?

arrays cuda char addition

-1
推荐指数
1
解决办法
2125
查看次数

如何在CUDA中将atomicAdd应用于数组的每个元素?

我有一个代码从CUDA示例到atomicAdd单个变量

__global__ void myadd(int *data)
{
  unsigned int x = blockIdx.x;
  unsigned int y = threadIdx.x;
  if ( (x%2==0) && (y%2==1) ) atomicAdd(data,1);
}

int main(void)
{
  int *Hdt;
  Hdt = (int*)malloc(sizeof(int));
  // ... CUDA initialization here
  myadd<<<20, 10>>>(Hdt);
  cudaFree(Hdt);
}
Run Code Online (Sandbox Code Playgroud)

它对我有用.但我正在扩展我的代码,所以我想将数组而不是数字传递给内核

__global__ void myadd(int *data)
{
  unsigned int x = blockIdx.x;
  unsigned int y = threadIdx.x;
  unsigned int z = threadIdx.y;
  if ( (x%2==0) && (y%2==1) && (z>4) ) atomicAdd(data[z],1);
}

int main(void)
{
  int *Hdt;
  Hdt …
Run Code Online (Sandbox Code Playgroud)

c++ cuda

-1
推荐指数
1
解决办法
2892
查看次数

将四个嵌套循环转换为CUDA内核

我正在编写CUDA程序,将模糊效果添加到BMP文件中.我编写了在CPU上执行此操作的程序,现在我正在尝试将代码转换为CUDA.这是我想要在CUDA上工作的功能:

void blur(bitmap_header* hp, unsigned char *data)
{
  int xx,yy,x,y, avgB, avgG, avgR, ile;
  int blurSize = 5;
    for(xx = 0; xx < hp->width; xx++)
    {
      for(yy = 0; yy < hp->height; yy++)
    {
        avgB = avgG = avgR = 0;
        ile = 0;

        for(x = xx; x < hp->width && x < xx + blurSize; x++)
        {


            for(y = yy; y < hp->height && y < yy + blurSize; y++)
            {
                avgB += data[x*3 + y*hp->width*3 + 0];
                avgG …
Run Code Online (Sandbox Code Playgroud)

c loops for-loop cuda nested

-1
推荐指数
1
解决办法
741
查看次数

在c ++项目中包含一个静态cuda库

我有一个模板化的静态CUDA库,我希望将其包含在一个通用的c ++项目中.当我包含库的头文件时,编译器崩溃并说它无法解析特定于CUDA的符号.当然g ++编译器无法解释这些符号.我知道这个问题,但我不知道如何使用nsight IDE解决这个问题.

我正在使用nsight,cuda/nvcc库和c ++/g ++项目.

控制台输出:

make all 
Building file: ../src/MedPrak.cpp
Invoking: GCC C++ Compiler
g++ -I/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/MedPrak.d" -MT"src/MedPrak.d" -o "src/MedPrak.o" "../src/MedPrak.cpp"

In file included from ../src/cudaWrapper.cu:8:0,
                 from ../src/MedPrak.cpp:3:

/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src/kernel.h:15:23: error: ‘__global__’ does not name a type
 template <typename T> __global__ void squareVector(T *input, T *output, int size) {
Run Code Online (Sandbox Code Playgroud)

编辑:忘了提到我有一个cuda项目,其文件与库中的文件相同.cuda项目编译正常并且运行正常,所以我认为我的代码中没有大的错误.

Edit2:避免"模板库"的想法.我有一个围绕实际模板类的包装器.所以没有"空"库.

c++ cuda g++ nvcc nsight

-1
推荐指数
1
解决办法
2515
查看次数

在CUDA计算能力3.5+中,所有线程(在SM上)是否真的每个都有255个寄存器?

我正在查看不同CUDA计算功能的以下最大值:

  1. 每个线程注册
  2. 每个寄存器(对称多处理器)
  3. 每个SM的线程

如出现在这里.嗯,它看起来像CUDA 3.5及以上,至少1 x 3> 2.这意味着虽然单个线程最多可以使用255个寄存器,但如果有太多线程尝试这样做,则会发生寄存器溢出.我的解释是否正确?或者说图1.不是真的正确,每个线程真的有64个寄存器吗?

cuda gpu gpgpu

-1
推荐指数
1
解决办法
260
查看次数

优化CUDA中的随机访问读取和随机访问写入

我想在以下代码中优化随机访问读取和随机访问写入:

__global__ void kernel(float* input, float* output, float* table, size_t size)
{
int x_id = blockIdx.x * blockDim.x + threadIdx.x;
if (x_id > size)
    return;

float in_f = input[x_id];
int in_i = (int)(floor(in_f));
int table_index = (int)((in_f - float(in_i)) * 1024000.0f );
float* t = table + table_index;
output[table_index] = t[0] * in_f;

}
Run Code Online (Sandbox Code Playgroud)

如您所见,表和输出的索引在运行时确定,并且完全随机.

我知道我可以使用纹理内存或__ldg()读取这些数据.所以,我的问题是:

  1. 有没有比使用纹理内存更好的方法来读取随机索引的数据__ldg()
  2. output[table_index]如上所述,随机访问写入怎么样?

实际上,我在这里添加代码以给出随机访问读写的示例.我不需要代码优化,我只需要高级描述处理这种情况的最佳方法.

cuda gpgpu

-1
推荐指数
1
解决办法
842
查看次数

我应该何时使用CUDA的内置warpSize,而不是我自己的常量?

nvcc设备代码可以访问内置值,warpSize该值设置为执行内核的设备的warp大小(即在可预见的将来为32).通常你不能把它区分为常数 - 但是如果你试图声明一个长度为warpSize的数组,你就会抱怨它是非常量的...(使用CUDA 7.5)

所以,至少为了这个目的,你有动力去做(编辑):

enum : unsigned int { warp_size  = 32 };
Run Code Online (Sandbox Code Playgroud)

在你的标题中的某个地方.但是现在 - 我应该选择哪个,何时?:warpSize,或warp_size

编辑: warpSize显然是PTX中的编译时常量.问题仍然存在.

c++ cuda constants gpu-warp

-1
推荐指数
2
解决办法
756
查看次数

定义atomicAdd函数在CUDA中不起作用

由于CUDA 2.0x没有atomicAdd()用于double的函数,因此我atomicAddd()根据此问题定义了“ atomicAdd()”函数,

为什么对double而言没有实现atomicAdd?

这是设备功能的代码:

__device__ double atomicAddd(double* address, double val)
{
    unsigned long long int* address_as_ull =
                             (unsigned long long int*)address;
    unsigned long long int old = *address_as_ull, assumed;
    do {
        assumed = old;
old = atomicCAS(address_as_ull, assumed,
                        __double_as_longlong(val +
                               __longlong_as_double(assumed)));
    } while (assumed != old);
    return __longlong_as_double(old);
}
Run Code Online (Sandbox Code Playgroud)

除功能名称外,代码均相同。

这是我内核的一部分:

__global__ void test(double *dev_like, double *dev_sum){
    __shared__ double lik;
    // some code to compute lik;
    // copy lik back to global dev_lik;
    dev_like[blockIdx.x] = …
Run Code Online (Sandbox Code Playgroud)

cuda

-1
推荐指数
1
解决办法
718
查看次数

GTX 1070中的FP64 CUDA内核数量

我找到了有关特斯拉P100每个SM包含多少CUDA核心的信息.它的64*FP32和32*FP64.我无法找到GTX 1070的任何数字.

也是后续问题.由于特斯拉的核心比例为1:2,这意味着双精度性能是单精度内核性能的最大值的一半吗?

hardware cuda gpu

-1
推荐指数
1
解决办法
602
查看次数

为什么cuda设备计数为零?

我正在编写一个简单的代码,尝试获取设备数量。

#include <cuda.h>
#include <iostream>

int main(){

  CUcontext cudaContext;
  int deviceCount = 0;
  CUresult result = cuDeviceGetCount(&deviceCount);
  std::cout << "device count = " << deviceCount << std::endl;

}
Run Code Online (Sandbox Code Playgroud)

编译命令:g ++ test.cpp -lcuda

当我尝试获取设备的计数时,即使我有gpu,我也得到零。

还是应该为零?

c++ cuda

-1
推荐指数
1
解决办法
189
查看次数

标签 统计

cuda ×10

c++ ×4

gpgpu ×2

gpu ×2

addition ×1

arrays ×1

c ×1

char ×1

constants ×1

for-loop ×1

g++ ×1

gpu-warp ×1

hardware ×1

loops ×1

nested ×1

nsight ×1

nvcc ×1