标签: gpu-programming

Cuda错误:函数已在另一个.cu.obj文件中定义

我正在尝试编写一个有人发给我的cuda项目.虽然编译阶段通过,但链接阶段失败.以下是错误的示例:

Error   298 error LNK2005: "int __cdecl compare_ints(void const *,void const *)" (?compare_ints@@YAHPBX0@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    
Run Code Online (Sandbox Code Playgroud)

基本上,文件decode_p4.cu.obj抱怨函数compare_ints已在3level_1.cu.obj中定义.关于如何避免这种行为的任何想法?

如果有帮助,下面是类似错误的列表:

Error   384 error LNK2005: "int __cdecl compare_ints(void const *,void const *)" (?compare_ints@@YAHPBX0@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    god
Error   385 error LNK2005: "int __cdecl cpu_intersection(unsigned int *,int,unsigned int *,int)" (?cpu_intersection@@YAHPAIH0H@Z) already defined in 3level_1.cu.obj    decode_p4.cu.obj    god
Error   386 error LNK2005: "int __cdecl intersection_cpu(unsigned int * * const,int * const,int)" (?intersection_cpu@@YAHQAPAIQAHH@Z) already defined in 3level_1.cu.obj    decode_p4.cu.obj    god
Error   387 error LNK2005: …
Run Code Online (Sandbox Code Playgroud)

cuda gpu gpgpu nvidia gpu-programming

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

是否可以使用CUDA来有效地计算排序数组内元素的频率?

我对Cuda很新,我从书中读了几章,在线阅读了很多教程.我已经在矢量加法和乘法上实现了自己的实现.

我想进一步移动,所以假设我们想要实现一个函数,它将整数的排序数组作为输入.

我们的目标是找到数组中每个整数的频率.

顺序我们可以扫描一次数组以产生输出.时间的复杂性将是O(n).

由于这些群体不同,我想必须有可能利用CUDA.

假设这是数组

   1
   1
   1
   1
   2
   2
   3
   3
   5
   5
   6
   7
Run Code Online (Sandbox Code Playgroud)

为了实现完全并行性,每个线程必须确切地知道它必须扫描的数组的哪个部分才能找到总和.只有当我们使用另一个数组时才能实现int dataPosPerThread[]这一点,对于每个线程id,dataPosPerThread[threadId]它将具有初始数组上的起始位置作为值.因此,这意味着每个线程都知道从哪里开始以及在哪里完成.

然而,通过这种方式,我们将无法获得任何收益,因为我们需要O(n)时间来找到这些位置.最终的总成本将O(n) + cost_to_transfer_the_data_to_the_gpu + O(c) + cost_to_transfer_the_results_to_the_gpu 在那里O(c)是恒定的时间,将采取的线程,找到最终的输出,假设,当然我们有最初的数组中许多不同的整数.

我想避免额外的O(n)费用.

到目前为止我所想的是,如果有一个大小的数组arraySize,我们指定将要使用的线程总数,让我们说totalAmountOfThreads这意味着每个线程都必须扫描totalAmountOfThreads/arraySize值.

第一个线程(id 0)将从位置0开始扫描到位置totalAmountOfThreads/arraySize.

第二个线程将从此开始totalAmountOfThreads/arraySize + 1,依此类推.

问题是虽然某些线程可能正在使用不同的整数组,或者有一个组具有更多值由其他线程处理.例如,在上面的例子中,如果我们假设我们将有6个线程,每个线程将采用数组的2个整数,所以我们将有这样的东西:

   1     <-------- thread 0
   1
   1     <-------- thread 1
   1
   2     <-------- thread 2
   2
   3     <-------- thread 3
   3
   5 …
Run Code Online (Sandbox Code Playgroud)

c++ cuda sorted frequency gpu-programming

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

CUDA和Thrust库:使用.cuh .cu和.cpp文件以及-std = c ++ 0x时出现问题

我想要一个.cuh文件,我可以在其中声明内核函数和宿主函数.这些函数的实现将在.cu文件中进行.实施将包括使用Thrust库.

main.cpp文件中,我想使用文件中的实现.cu.所以我们说我们有这样的事情:

myFunctions.cuh

#include <thrust/sort.h>
#include <thrust/device_vector.h>
#include <thrust/remove.h>
#include <thrust/host_vector.h>
#include <iostream>

__host__ void show();
Run Code Online (Sandbox Code Playgroud)

myFunctions.cu

#include "myFunctions.cuh"

__host__ void show(){
   std::cout<<"test"<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include "myFunctions.cuh"

int main(void){

    show();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我通过这样做编译:

nvcc myFunctions.cu main.cpp -O3
Run Code Online (Sandbox Code Playgroud)

然后键入以运行可执行文件 ./a.out

test文本将被打印出来.

但是,如果我决定-std=c++0x使用以下命令包含:

nvcc myFunctions.cu main.cpp -O3 --compiler-options "-std=c++0x"
Run Code Online (Sandbox Code Playgroud)

我收到很多错误,其中一些错误如下:

/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h(159): error: identifier "nullptr" is undefined

/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h(159): error: expected a ";"

/usr/include/c++/4.6/bits/exception_ptr.h(93): error: incomplete type is not …
Run Code Online (Sandbox Code Playgroud)

parallel-processing cuda gpu-programming thrust c++11

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

CUDA:我如何运行Mark Harris在NVIDIA论文中描述的求和的并行缩减代码?

虽然我理解了本文中描述的并行缩减背后的逻辑,但我似乎无法在输入数组为1的简单示例中运行它size.

这是我到目前为止所取得的成就.请记住,我正在使用推力库来管理输入和输出数据.

#include <iostream>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
#include <ctime>
#include <sys/time.h>
#include <sstream>
#include <string>
#include <fstream>

using namespace std;


__global__ void reduce0(int *g_idata, int *g_odata){

   extern __shared__ int sdata[];

  unsigned int tid = threadIdx.x;
  unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
  sdata[tid] = g_idata[i];

  __syncthreads();

  for(unsigned int s=1; s < blockDim.x; s *= 2) {
     if (tid % (2*s) == 0) {
        sdata[tid] += sdata[tid + s];
     }
  __syncthreads();
 }
 if (tid …
Run Code Online (Sandbox Code Playgroud)

cuda reduction gpu-programming

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

只计算向量CUDA/THRUST的正元素

我想使用Thrust(因为我的大部分方法是使用推力数据类型实现)或C CUDA,如果需要,只能对向量的正浮点元素求和.数据最初未排序.我的初始刺伤非常糟糕:基本上,复制矢量,对其进行排序,通过将其传递到内核来找到零交叉,该内核比较顺序成对值并写入与零交叉匹配的内核.排序后基本上(我用Thrust做)...

int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n - 1) {
  float a = vector[i];
  float b = vector[i + 1];
  if (a >= 0.0 && b < 0.0)
    answer = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

这真的是愚蠢的,很多线程匹配条件,太多的读取,分支差异等等.所以,它完全失败,每次调用将在相同的数据上给出不同的结果,等等.

我还没有找到一个在Thrust中实现这个的好方法,这是我更喜欢的.排序后我不知道如何找到过零点.有关跳跃点的建议吗?一个实际工作简单的CUDA C实现也会很好.

cuda gpu gpgpu gpu-programming thrust

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

如何用CUDA选择GPU?

我有一台带2个GPU的电脑; 我写了一个CUDA C程序,我需要以某种方式告诉它我只想在2张图形卡中的1张上运行它; 我需要键入什么命令以及如何使用它?我相信某种方式与cudaSetDevice有关但我无法真正找到如何使用它.

cuda gpu gpu-programming

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

为什么需要包含&lt;stdio.h&gt;才能使用CUDA的printf()?

我想要printf()CUDA内核中的某些内容。[《编程指南》建议[1]:

#include <stdio.h>

__global__ void helloCUDA(float f)
{
    printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}
Run Code Online (Sandbox Code Playgroud)

但这只是包括标准C库的stdio.h。为什么那是必要的?CUDA的printf()行为与stdio的行为不同printf();我当然不需要那里的所有其他东西。

c++ printf cuda gpu-programming

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

CUDA GPU是按位置选择的,但是如何将default设置为设备0以外的值?

我最近在家中的机器上安装了第二个GPU(Tesla K40),我的搜索建议第一个PCI插槽成为为CUDA作业选择的默认GPU。一个很棒的链接正在解释它,可以在这里找到:

默认GPU分配

我最初的GPU是TITAN X,也支持CUDA,但它实际上最适合单精度计算,而Tesla则更适合双精度。对于该小组,我的问题是是否有办法将我的默认CUDA编程设备始终设置为第二个?显然,我每次都可以在代码中指定要使用的设备,但是我希望可以对设备进行配置,使其始终默认使用特斯拉卡。

还是打开包装盒并实际交换设备位置的唯一方法?不知怎么对我来说...

任何建议或相关链接可以跟进。

cuda nvidia gpu-programming

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

CAFFE:Cuda Error"(8 vs. 0)无效设备功能"使用GPU(GeForce GTX 970)时?

我正在尝试在GTX 970上运行CNN网络"CAFFE".但是我收到了标题中提到的错误.

有人可以帮忙吗?

我发布了关于caffe组的更多细节的问题,但没有得到任何提示/答案!

https://groups.google.com/forum/#!topic/caffe-users/sVOfE0qhf_M

更新1

在我的Makefile.config中,我添加了 -gencode arch=compute_52,code=compute_52

CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
        -gencode arch=compute_20,code=sm_21 \
        -gencode arch=compute_30,code=sm_30 \
        -gencode arch=compute_35,code=sm_35 \
        -gencode arch=compute_35,code=sm_35 \
        -gencode arch=compute_50,code=compute_50 \
        -gencode arch=compute_52,code=compute_52     
Run Code Online (Sandbox Code Playgroud)

但是当我尝试制作时,它会返回:

$make
NVCC src/caffe/layers/cudnn_sigmoid_layer.cu
nvcc fatal   : Unsupported gpu architecture 'compute_52'
Makefile:531: recipe for target '.build_release/cuda/src/caffe/layers/cudnn_sigmoid_layer.o' failed
make: *** [.build_release/cuda/src/caffe/layers/cudnn_sigmoid_layer.o] Error 1
Run Code Online (Sandbox Code Playgroud)

更新2

NCC版本是:

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2014 NVIDIA Corporation
Built on Thu_Jul_17_21:41:27_CDT_2014
Cuda compilation tools, release 6.5, V6.5.12
Run Code Online (Sandbox Code Playgroud)

更新3

我正在使用带有346.96驱动程序的CUDA …

cuda gpu-programming caffe

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

如何理解"warp中的所有线程同时执行相同的指令." 在GPU?

我正在阅读专业CUDA C编程,并在GPU架构概述部分:

CUDA采用单指令多线程(SIMT)架构来管理和执行32个被称为warp的组中的线程.warp中的所有线程同时执行相同的指令.每个线程都有自己的指令地址计数器和寄存器状态,并对自己的数据执行当前指令.每个SM将分配给它的线程块分区为32线程warp,然后调度它以便在可用的硬件资源上执行.

SIMT架构类似于SIMD(单指令,多数据)架构.SIMD和SIMT都通过向多个执行单元广播相同的指令来实现并行性.一个关键的区别是SIMD要求向量中的所有向量元素在一个统一的同步组中一起执行,而SIMT允许同一warp中的多个线程独立执行.即使warp中的所有线程在同一程序地址处一起启动,单个线程也可能具有不同的行为.SIMT使您能够为独立的标量线程编写线程级并行代码,以及为协调线程编写数据并行代码.SIMT模型包括SIMD不具备的三个关键功能:
➤每个线程都有自己的指令地址计数器.
➤每个线程都有自己的寄存器状态.
➤每个线程都可以有一个独立的执行路径.

第一段提到" All threads in a warp execute the same instruction at the same time.",而在第二段则提到" Even though all threads in a warp start together at the same program address, it is possible for individual threads to have different behavior.".这让我感到困惑,上述陈述似乎是矛盾的.任何人都可以解释一下吗?

cuda gpu nvidia gpu-programming multiple-gpu

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