相关疑难解决方法(0)

使用CUDA减少矩阵行

Windows 7, NVidia GeForce 425M.
Run Code Online (Sandbox Code Playgroud)

我写了一个简单的CUDA代码来计算矩阵的行和.矩阵具有单维表示(指向浮点的指针).

代码的串行版本如下(它有2循环,如预期的那样):

void serial_rowSum (float* m, float* output, int nrow, int ncol) {
    float sum;
    for (int i = 0 ; i < nrow ; i++) {
        sum = 0;
        for (int j = 0 ; j < ncol ; j++)
            sum += m[i*ncol+j];
        output[i] = sum;
    }
}
Run Code Online (Sandbox Code Playgroud)

在CUDA代码中,我调用内核函数按行扫描矩阵.下面是内核调用片段:

dim3 threadsPerBlock((unsigned int) nThreadsPerBlock); // has to be multiple of 32
dim3 blocksPerGrid((unsigned int) ceil(nrow/(float) nThreadsPerBlock)); 

kernel_rowSum<<<blocksPerGrid, threadsPerBlock>>>(d_m, d_output, nrow, ncol);
Run Code Online (Sandbox Code Playgroud)

以及执行行的并行求和的内核函数(仍有1 …

c cuda matrix

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

CUDA:如何直接在GPU上使用thrust :: sort_by_key?

Thrust库可用于对数据进行排序.调用可能看起来像这样(带有键和值向量):

thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin());
Run Code Online (Sandbox Code Playgroud)

称为在CPU上,以d_keysd_values在CPU存储器是; 并且大部分执行都发生在GPU上.

但是,我的数据已经在GPU上?如何使用Thrust库直接在GPU上执行高效排序,即sort_by_key从内核调用函数?

此外,我的数据包括或者是unsigned long long int或者unsigned int始终是数据的键 unsigned int.我应该如何对这些类型进行推力调用?

sorting cuda thrust

8
推荐指数
1
解决办法
4136
查看次数

在线程中使用thrust :: sort

我想知道在一个线程中是否可以使用thrust :: sort()

__global__
void mykernel(float* array, int arrayLength)
{
    int threadID = blockIdx.x * blockDim.x + threadIdx.x;
    // array length is vector in the device global memory
    // is it possible to use inside the thread?
    thrust::sort(array, array+arrayLength);
    // do something else with the array
}
Run Code Online (Sandbox Code Playgroud)

如果是,那么sort会启动其他内核来并行排序吗?

cuda thrust

5
推荐指数
1
解决办法
3094
查看次数

推进cuda内核

我也在我的机器上安装了cuda 8.0(Linux SL7),我已经下载了推力1.8.1并用新的1.8.1替换了现有的推力库.

据我所知,从推力1.8开始支持并可以在内核中使用.我引用他们的网站:

Thrust 1.8.0引入了对CUDA __device__代码的算法调用的支持,对CUDA流的支持以及算法性能的改进.用户现在可以从CUDA __device__代码调用Thrust算法

但是,当我使用Nsight eclipse构建应用程序时,它会向我显示以下错误:

不允许从__global__函数("mykernel")调用__host__函数("thrust :: sort").

请问有什么建议吗?

这是我的代码:

#include <iostream>
#include <numeric>
#include <stdlib.h>
#include <stdio.h>
#include <cuda_runtime.h>
#include <cuda.h>
#include <thrust/sort.h>
#include <thrust/execution_policy.h>

__global__ void mykernel(int* a, int* b)
{

thrust::sort(a, a + 10);
}

int main(void)
{
    int a[10] = { 0, 9, 7, 3, 1, 6, 4, 5, 2, 8 };
    int b[10];
    int *d_a, *d_c;

    cudaMalloc((void**)&d_a, 10 * sizeof(int));
    cudaMalloc((void**)&d_c, 10 * sizeof(int));

    std::cout << "A\n";
    for (int i …
Run Code Online (Sandbox Code Playgroud)

cuda thrust

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

CUDA 中的推力::device_vector

我是 CUDA 的新手,正在尝试学习用法。有人可以帮忙吗?我在主函数中有以下内容(我在 Visual Studio 中,我的源文件和头文件分别是 .cu 和 .cuh)

 thrust::device_vector<float> d_vec(100);
 kernel<<<100,1>>>(d_vec);
Run Code Online (Sandbox Code Playgroud)

然后在内核中我有

    template <typename T> __global__ kernel(thrust::device_vector<T> d_vec)
    {  int tid = threadIdx.x + blockIdx.x*blockDim.x;
       T xxx = 3.0;
       d_vec[tid] = xxx;
     }
Run Code Online (Sandbox Code Playgroud)

我的目标是用 float 调用内核一次,用 double 调用一次。还要注意,在这个简单的例子中,我有变量 xxx(在我的实际情况下是一些产生双精度或浮点数的计算)。

和我得到两个误差:1>调用__host__从函数(操作符=)__global__函数是不允许2>调用一个__host__从函数(操作符[])__global__函数是不允许

所以我猜“d_vec[tid] = ..”中的“[]”和“=”是问题所在。但我的问题是如何访问内核中的设备向量。有人可以澄清什么是正确的程序以及我做错了什么。提前致谢

c++ cuda visual-studio-2010

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

标签 统计

cuda ×5

thrust ×3

c ×1

c++ ×1

matrix ×1

sorting ×1

visual-studio-2010 ×1