我正在使用推力分区功能将数组划分为偶数和奇数.但是,当我尝试显示设备矢量时,它会显示随机值.请告诉我错误在哪里.我想我做的一切都是正确的.
#include<stdio.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include<thrust/partition.h>
struct is_even
{
//const int toCom;
//is_even(int val):toCom(val){}
__device__
bool operator()(const int &x)
{
return x%2;
}
};
void main(){
thrust::host_vector<int> H(6);
for(int i =0 ; i<H.size();i++){
H[i] = i+1;
}
thrust::device_vector<int> D = H;
thrust::partition(D.begin(),D.end(),is_even());
for(int i =0 ;i< D.size();i++){
printf("%d,",D[i]);
}
getchar();
}
Run Code Online (Sandbox Code Playgroud) 我正在对GPGPU进行一些研究,目前正在努力解决特斯拉和CUDA究竟是什么问题.在"NVIDIA Tesla:统一图形和计算架构"一文中,它说特斯拉架构是随GeForce 8800推出的.随着进一步的阅读,我确信它是NVIDIA显卡的整体架构.不幸的是,事实并非如此.在http://www.nvidia.com/object/why-choose-tesla.html上,他们明确地分离了GeForce,Quadro和Tesla.那么与CUDA有什么关系呢?它只是Cuda-C硬件支持的GPU上的一般计算的扩展吗?SM,SIMT,线程同步,共享内存,Warp等概念到底是什么相关的?CUDA?特斯拉?此外http://nvidia.custhelp.com/app/answers/detail/a_id/2133/~/what-is-the-difference-between-tesla-and-cuda%3F特斯拉是一系列专为产品设计的产品高性能计算和CUDA只是软件.有人能澄清一下吗?
我的系统中没有安装GPU卡.我想知道是否有任何方法可以在CUDA中编码并在我的无GPU笔记本电脑上访问CUDA库?
我正在进行人工智能的博士研究,而且我已经开始使用CUDA库作为我的测试平台了.我以前玩过CUDA,我对GPGPU的工作原理有基本的了解,但我对浮点精度感到不安.
看看GTX680,我看到FP64:1/24 FP32,而特斯拉的完整FP64为1.31 TFLOPS.我很清楚,一张是游戏卡,而另一张是专业卡.
我问的原因很简单:我买不起特斯拉,但我可能得到两个GTX680.虽然主要目标是拥有尽可能多的CUDA内核和内存,但浮点精度可能会成为一个问题.
我的问题是:
谢谢 !
我正在使用动态并行性来实现一个程序.每当我编译代码时,它都会抛出致命错误,如下所示:
ptxas fatal : Unresolved extern function 'cudaGetParameterBuffer'
编译如下:
nvcc -o dyn_par dyn_par.cu -arch=sm_35
怎么解决?
我有一个简单的扫描内核,它计算循环中几个块的扫描.我注意到当get_local_id()存储在局部变量中而不是在循环内调用它时,性能会有所上升.所以用代码总结一下,这个:
__kernel void LocalScan_v0(__global const int *p_array, int n_array_size, __global int *p_scan)
{
const int n_group_offset = get_group_id(0) * SCAN_BLOCK_SIZE;
p_array += n_group_offset;
p_scan += n_group_offset;
// calculate group offset
const int li = get_local_id(0); // *** local id cached ***
const int gn = get_num_groups(0);
__local int p_workspace[SCAN_BLOCK_SIZE];
for(int i = n_group_offset; i < n_array_size; i += SCAN_BLOCK_SIZE * gn) {
LocalScan_SingleBlock(p_array, p_scan, p_workspace, li);
p_array += SCAN_BLOCK_SIZE * gn;
p_scan += SCAN_BLOCK_SIZE * gn;
}
// process all …Run Code Online (Sandbox Code Playgroud) 当我尝试运行这个简单的OpenGL测试程序时,我遇到了分段错误.只有在使用核心配置文件标志创建上下文时才会发生这种情况.如果我使用兼容性配置文件标志,程序运行没有问题.
编辑:我检查了函数的指针glGenVertexArrays,然后返回NULL.如果glfwCreateWindow没有返回NULL,并glGetString(GL_VERSION)确认上下文是版本4.3并glewInit返回GLEW_OK那么为什么glGenVertexArrays == NULL?
我的操作系统是64位Windows 7,而我的GPU是带有331.82 WHQL驱动程序的Nvidia GTX 760.
码:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
#define GLSL(src) "#version 430 core\n" #src
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
GLuint create_program(const char* vertex_source, const char* fragment_source)
{
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_source, NULL);
glCompileShader(vs); …Run Code Online (Sandbox Code Playgroud) 我想在我的OpenCL内核中优化我的本地内存访问模式.我在某处读到了可配置的本地内存.例如,我们应该能够配置哪个量用于本地mem以及哪个量用于自动缓存.
另外我读到银行大小可以在这里选择最新的(开普勒)Nvidia硬件:http: //www.acceleware.com/blog/maximizing-shared-memory-bandwidth-nvidia-kepler-gpus.这一点对于本地存储器中的双精度值存储似乎非常关键.
Nvidia是否提供专门为CUDA用户设置本地内存的功能?我找不到OpenCL的类似方法.这可能是以不同的方式调用,还是真的不存在?
我遇到了编译错误,将bool向量复制到cuda内存将失败
bool *gpu;
cudaMalloc(reinterpret_cast<void **>(&gpu), 100);
std::vector<bool> cpu(100);
for(int i=0;i<100;i++){
cpu[i]=true;
}
cudaMemcpy(gpu, cpu.data(), 100*sizeof(bool), cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)
它回来了
error: invalid use of void expression cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)
但是带有float向量的相同代码将被编译.
float *gpu;
cudaMalloc(reinterpret_cast<void **>(&gpu), 100);
std::vector<float> cpu(100);
for(int i=0;i<100;i++){
cpu[i]=i;
}
cudaMemcpy(gpu, cpu.data(), 100*sizeof(float), cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
从官方的NVIDIA Multi-Process Server 文档看,我不清楚它如何与CUDA流交互。
这是一个例子:
应用0:将内核发布到逻辑流0;
App 1:将内核发布到(自己的)逻辑流0。
在这种情况下,
1)MPS是否/如何“劫持”这些CUDA调用?对于每个应用程序,它是否完全了解使用了哪些流以及哪些流中包含哪些内核?
2)MPS是否创建自己的2个流,并将相应的内核放入正确的流?还是MPS可能通过流以外的机制启用内核并发?
如果有帮助,我对MPS在Volta上的工作方式很感兴趣,但是也希望了解有关旧体系结构的信息。