在Python中使用DLL文件最简单的方法是什么?
具体来说,如何在不编写任何额外的包装C++代码来向Python公开功能的情况下完成这项工作?
与使用第三方库相比,本机Python功能更受欢迎.
从我在这里读到的一些评论中,出于某种原因,对于像CUDA这样的并行实现,最好有Structure of Arrays(SoA)over Array of Structures(AoS)吗?如果这是真的,谁能解释为什么?提前致谢!
如何获得最大(最小)元素(res.val和res.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内核执行时间.最佳实践指南说我们可以使用clock()Windows中的事件或标准计时功能.我的问题是使用这两个函数给我一个完全不同的结果.事实上,事件给出的结果与实际的实际速度相比似乎是巨大的.
我真正需要的是通过首先在较小的数据集上运行它的简化版本来预测计算的运行时间.不幸的是,这个基准测试的结果是完全不现实的,要么过于乐观(clock())还是过于悲观(事件).
我试图从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) 我正在尝试使用原子指令在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) 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 …
我们做复数乘法如下:
(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)
这涉及四次实数乘法.我们怎么能只用三次实数乘法呢?
如果我使用thrust::transform上thrust::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.
我正在努力熟悉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)