小编Jac*_*ern的帖子

我如何使用Python的DLL文件?

在Python中使用DLL文件最简单的方法是什么?

具体来说,如何在编写任何额外的包装C++代码来向Python公开功能的情况下完成这项工作?

与使用第三方库相比,本机Python功能更受欢迎.

python dll

176
推荐指数
5
解决办法
28万
查看次数

数组结构与CUDA中的结构数组

从我在这里读到的一些评论中,出于某种原因,对于像CUDA这样的并行实现,最好有Structure of Arrays(SoA)over Array of Structures(AoS)吗?如果这是真的,谁能解释为什么?提前致谢!

c c++ arrays struct cuda

41
推荐指数
2
解决办法
3万
查看次数

使用CUDA Thrust查找最大元素值及其位置

如何获得最大(最小)元素(res.valres.pos)的值以及位置?

thrust::host_vector<float> h_vec(100);
thrust::generate(h_vec.begin(), h_vec.end(), rand);
thrust::device_vector<float> d_vec = h_vec;

T res = -1;
res = thrust::reduce(d_vec.begin(), d_vec.end(), res, thrust::maximum<T>());
Run Code Online (Sandbox Code Playgroud)

cuda thrust

15
推荐指数
2
解决办法
8227
查看次数

定时CUDA操作

我需要计算一次CUDA内核执行时间.最佳实践指南说我们可以使用clock()Windows中的事件或标准计时功能.我的问题是使用这两个函数给我一个完全不同的结果.事实上,事件给出的结果与实际的实际速度相比似乎是巨大的.

我真正需要的是通过首先在较小的数据集上运行它的简化版本来预测计算的运行时间.不幸的是,这个基准测试的结果是完全不现实的,要么过于乐观(clock())还是过于悲观(事件).

c benchmarking cuda

14
推荐指数
3
解决办法
2万
查看次数

CUDA矢量类型的效率(float2,float3,float4)

我试图从CUDA例子中理解integrate_functorin particles_kernel.cu:

struct integrate_functor
{
    float deltaTime;    
    //constructor for functor
    //...

    template <typename Tuple>
    __device__
    void operator()(Tuple t)
    {
        volatile float4 posData = thrust::get<2>(t);
        volatile float4 velData = thrust::get<3>(t);

        float3 pos = make_float3(posData.x, posData.y, posData.z);
        float3 vel = make_float3(velData.x, velData.y, velData.z);

        // update position and velocity
        // ...

        // store new position and velocity
        thrust::get<0>(t) = make_float4(pos, posData.w);
        thrust::get<1>(t) = make_float4(vel, velData.w);
    }
};
Run Code Online (Sandbox Code Playgroud)

我们打电话make_float4(pos, age)但是make_float4被定义vector_functions.h

static __inline__ __host__ __device__ float4 …
Run Code Online (Sandbox Code Playgroud)

c cuda thrust

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

在CUDA中实现关键部分

我正在尝试使用原子指令在CUDA中实现一个关键部分,但我遇到了一些麻烦.我创建了测试程序来显示问题:

#include <cuda_runtime.h>
#include <cutil_inline.h>
#include <stdio.h>

__global__ void k_testLocking(unsigned int* locks, int n) {
    int id = threadIdx.x % n;
    while (atomicExch(&(locks[id]), 1u) != 0u) {} //lock
    //critical section would go here
    atomicExch(&(locks[id]),0u); //unlock
}

int main(int argc, char** argv) {
    //initialize the locks array on the GPU to (0...0)
    unsigned int* locks;
    unsigned int zeros[10]; for (int i = 0; i < 10; i++) {zeros[i] = 0u;}
    cutilSafeCall(cudaMalloc((void**)&locks, sizeof(unsigned int)*10));
    cutilSafeCall(cudaMemcpy(locks, zeros, sizeof(unsigned int)*10, cudaMemcpyHostToDevice));

    //Run …
Run Code Online (Sandbox Code Playgroud)

synchronization cuda locking critical-section

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

使用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万
查看次数

复数乘积仅使用三次乘法

我们做复数乘法如下:

(a + i * b) * (c + i * d) = (a * c - b * d) + i * (a * d + b * c)
Run Code Online (Sandbox Code Playgroud)

结果的实部和虚部是

real part = (a * c - b * d)
imag part = (a * d + b * c)
Run Code Online (Sandbox Code Playgroud)

这涉及四次实数乘法.我们怎么能只用三次实数乘法呢?

algorithm math complex-numbers

13
推荐指数
4
解决办法
7464
查看次数

使用CUDA的Lambda表达式

如果我使用thrust::transformthrust::host,拉姆达用法是罚款

thrust::transform(thrust::host, a, a+arraySize,b,d,[](int a, int b)->int
{
    return a + b;
});
Run Code Online (Sandbox Code Playgroud)

但是,如果我thrust::host改为thrust::device,代码将不会通过编译器.这是VS2013上的错误:

lambda的闭包类型("lambda [](int,int) - > int")不能在__global__函数模板实例化的模板参数类型中使用,除非lambda是在一个__device____global__函数内定义的

所以,问题是如何使用__device____global__连接到设备lambdas.

c++ lambda cuda c++11

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

CUDA:平铺矩阵 - 矩阵乘法,共享内存和矩阵大小,是块大小的非倍数

我正在努力熟悉CUDA编程,并且有一段非常有趣的时间.我目前正在研究这个处理矩阵乘法的pdf,有和没有共享内存.这两个版本的完整代码都可以在这里找到.该代码几乎与CUDA矩阵乘法样本中的代码完全相同.虽然非共享内存版本具有以任何矩阵大小运行的能力,但无论块大小如何,共享内存版本必须与块大小的倍数(我设置为4,默认最初为16)的矩阵一起使用.

在pdf结尾处提出的问题之一是更改它,以便共享内存版本也可以使用块大小的非倍数.我认为这将是一个简单的索引检查,就像在非共享版本中一样:

int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if(row > A.height || col > B.width) return;
Run Code Online (Sandbox Code Playgroud)

但这不起作用.这是完整的代码,减去主要的方法(有点乱,对不起),我已经有所修改了:

void MatMul(const Matrix A, const Matrix B, Matrix C) { 
  // Load A and B to device memory 
  Matrix d_A; 
  d_A.width = d_A.stride = A.width; 
  d_A.height = A.height; 
  size_t size = A.width * A.height * sizeof(float); 
  cudaError_t err = cudaMalloc(&d_A.elements, size); 
  printf("CUDA malloc A: %s\n",cudaGetErrorString(err)); 
  err = cudaMemcpy(d_A.elements, A.elements, …
Run Code Online (Sandbox Code Playgroud)

c cuda matrix

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