- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个项目,我必须在 Visual Studio/CUDA 中使用包含 2 个随机数组 A
和 B< 的 GPU 线程和 block 创建程序
用于在将结果存储到第三个数组 C
之前计算基于此等式的值:
C(1,j)=max(A(:,j)+max(B(:,j))
(注意:“:"运算符表示所有行)
这是我的内核函数
__global__ void mykernel(int **a, int **b,int **c,const int width)
{
int col= threadIdx.x;
int tempa=0;
int tempb=0;
for(int k=0;k<width;k++){
int maxA=a[k][col];
if (maxA>tempa){
tempa=maxA;
}
int maxB=b[k][col];
if (maxB>tempb){
tempb=maxB;
}
}
c[0][col] =tempa+tempb;
}
还有我的主要
int main()
{
const int dim= 5;
const int rows=5;
const int columns=5;
size_t dsize = rows*columns*sizeof(int);
//Αντίγραφα πινάκων δεδομένων της CPU
int *A[dim][dim];
int *B[dim][dim];
int *C[1][dim];
//Αντίγραφα πινάκων δεδομένων της GPU
int *d_A[dim][dim],*d_B[dim][dim],*d_C[1][dim];
//Εξασφάλιση μνήμης για τα αντίγραφα δεδομένων της CPU
A[dim][dim]= (int *)malloc(dsize);
B[dim][dim] = (int *)malloc(dsize);
C[1][dim]= (int *)malloc(dsize);
//Γέμισμα των πινάκων με τυχαίες τιμές μεταξυ
for (int i=0;i<rows;i++)
for (int j=0;j<columns;j++){
*A[i][j]=rand() %5+1;
*B[i][j]=rand() %5+1;
}
//Εξασφάλιση μνήμης για τα αντίγραφα δεδομένων της GPU και αντιγραφή δεδομένων CPU προς GPU
cudaMalloc((void **)&d_A, dsize);
cudaMemcpy(d_A, A, dsize, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_B, dsize);
cudaMemcpy(d_B, B, dsize, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_C, dsize);
//Κλήση Kernel συνάρτησης στην GPU με χρήση 5 Threads σε 1 Block
mykernel<<<1,5>>>(d_A,d_B,d_C,dim);
//Αντιγραφή αποτελέσματος στην μνήμη της CPU
cudaMemcpy(C, d_C, dsize, cudaMemcpyDeviceToHost);
//Εκκαθάριση Μνήμης για CPU και GPU
free(A);
free(B);
free(C);
cudaFree(d_A); cudaFree(d_B); cudaFree(d_C);
while(1){};
return 0;
}
我想我的算法是正确的,但在这一行中我得到了以下错误:
行
mykernel<<<1,5>>>(d_A,d_B,d_C,dim);
错误
argument of type "int *(*)[5]" is incompatible with parameter of type "int **"
对我应该做什么有什么建议吗?
最佳答案
首先,无论何时您在使用 CUDA 代码时遇到问题,我都建议您使用 proper CUDA error checking 并使用 cuda-memcheck
(例如从命令行)运行您的代码。
这不是你想的那样:
int *A[dim][dim];
这是创建一个二维指针数组。您需要的是指向二维数组(int
)的指针。
在 C 中,当您定义一个数组时,您不能为数组维度的元素分配任何内容:
A[dim][dim]= (int *)malloc(dsize);
数组的大小只能达到 dim
- 1。A[dim][dim]
不存在并且超出了数组定义的范围。这似乎与您对在 C 或 C++ 中使用二维数组的一般混淆有关。
这一行同样被打断(将数值分配给与未分配指针关联的区域),进一步证明您对 C 中的二维数组感到困惑:
*A[i][j]=rand() %5+1;
您对 d_A
、d_B
和 d_C
的处理同样有问题。
很明显,您想要在 CUDA 内核中使用二维数组,因此这里正确的方法可能是从一组 canonical examples 中选择一个方法。由于您在编译时似乎知道数组维度,我们将 leverage that 。这是一个显示模组的完整示例:
$ cat t1344.cu
#include <iostream>
const int dim = 5;
typedef int my_arr[dim];
__global__ void mykernel(my_arr *a, my_arr *b, my_arr *c,const int width)
{
int col= threadIdx.x;
int tempa=0;
int tempb=0;
for(int k=0;k<width;k++){
int maxA=a[k][col];
if (maxA>tempa){
tempa=maxA;
}
int maxB=b[k][col];
if (maxB>tempb){
tempb=maxB;
}
}
c[0][col] =tempa+tempb;
}
int main()
{
const int rows=dim;
const int columns=dim;
size_t dsize = rows*columns*sizeof(int);
//Αντίγραφα πινάκων δεδομένων της CPU;
my_arr *A, *B, *C;
//Αντίγραφα πινάκων δεδομένων της GPU
my_arr *d_A,*d_B,*d_C;
//Εξασφάλιση μνήμης για τα αντίγραφα δεδομένων της CPU
A = (my_arr *)malloc(dsize);
B = (my_arr *)malloc(dsize);
C = (my_arr *)malloc(dsize);
//Γέμισμα των πινάκων με τυχαίες τιμές μεταξυ
for (int i=0;i<rows;i++)
for (int j=0;j<columns;j++){
A[i][j]=rand() %5+1;
B[i][j]=rand() %5+1;
}
//Εξασφάλιση μνήμης για τα αντίγραφα δεδομένων της GPU και αντιγραφή δεδομένων CPU προς GPU
cudaMalloc((void **)&d_A, dsize);
cudaMemcpy(d_A, A, dsize, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_B, dsize);
cudaMemcpy(d_B, B, dsize, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_C, dsize);
//Κλήση Kernel συνάρτησης στην GPU με χρήση 5 Threads σε 1 Block
mykernel<<<1,5>>>(d_A,d_B,d_C,dim);
//Αντιγραφή αποτελέσματος στην μνήμη της CPU
cudaMemcpy(C, d_C, dsize, cudaMemcpyDeviceToHost);
for (int i = 0; i < dim; i++) std::cout << C[0][i] << std::endl;
//Εκκαθάριση Μνήμης για CPU και GPU
free(A);
free(B);
free(C);
cudaFree(d_A); cudaFree(d_B); cudaFree(d_C);
return 0;
}
$ nvcc -arch=sm_35 -o t1344 t1344.cu
$ cuda-memcheck ./t1344
========= CUDA-MEMCHECK
9
8
8
9
8
========= ERROR SUMMARY: 0 errors
$
我还没有完全验证结果,但它们对我来说似乎是合理的。
关于c++ - CUDA Vision Studio 内核问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47626429/
我正在从 spring boot maven 项目调用 google vision OCR api 以从图像中提取文本。 public class TestGoogleVision { Buffere
是否可以使用 Google Vision API 读取姓名、地址、出生日期等身份证信息?在文档中,我找到了一些东西,但我不知道如何使用它。 https://developers.google.com/
请看两个测试结果。 有两种语言,但 Cloud vision api 总是以一种语言返回结果。 我们能否告诉图像中需要哪种语言,以便引擎可以尝试识别所有字符,即使它们是不同的语言? 1. 原图有3个汉
如何调用 Vision API 并在图像上应用多个功能。 我想在图像上同时应用标签检测和地标检测 最佳答案 您可以如下定义您的请求,以在每个图像中包含多个功能请求 "requests":[
我正在探索 Cloud Vision API 的功能,我想知道是否有任何方法可以检测标签检测下对象的尺寸。例如,如果您在街上拍摄汽车的照片,则 Cloud Vision API 将返回汽车的尺寸(长度
首先,请原谅我的英语不好。我在里面工作。 我正在从事计算机视觉应用方面的工作。我正在使用网络摄像头。主循环是这样的: while true get frame process
我正在尝试训练一个模型来识别图像中的某些标签。我尝试使用 1 小时免费版本,一小时后培训结束。结果并不像我想要的那么准确,所以我冒险选择了没有定义训练模型的具体时间限制的选项。 此时,它显示“训练视觉
我试图识别的最简单的例子: 我用 DOCUMENT_TEXT_DETECTION ,但在答案中我得到了象形文字。 如果我使用 Eng在 ImageContext addAllLanguageHints
我将其交叉发布到 Cloud Vision 的谷歌组... 并添加了一些额外的发现。 以下是我认为相关的所有细节: 使用 VB.NET 2010 使用服务帐号认证 仅限于 .NET 4.0 使用这些
我正在尝试使用 Google Vision API。我正在关注 getting started guide : 我已启用 Cloud Vision API 我已启用计费 我已经设置了 API key
我对使用Microsoft的认知服务还很陌生。我想知道MS Computer Vision API和MS Custom Vision API有什么区别? 最佳答案 它们都处理图像上的计算机视觉,但是希
知道如何将规范化顶点转换为顶点吗?归一化顶点给出了图像上的相对位置,而顶点根据图像的比例返回坐标。我有一组标准化顶点,我想将其转换为常规顶点。 https://cloud.google.com/vis
我正在使用 google cloud vision api 来分析图片。是否有 labelAnnotations 方法的所有可能响应的列表? 最佳答案 API reference Vision API
Google Cloud Vision API(测试版)的第 1 版允许通过 TEXT_DETECTION 请求进行光学字符识别。虽然识别质量很好,但返回的字符没有任何原始布局的暗示。因此,结构化文本
假设我有图像并且我想用西类牙语为它们生成标签 - Google Cloud Vision API 是否允许选择以哪种语言返回标签? 最佳答案 标签检测 Google Cloud Vision API
我使用 import torchvision 时遇到的错误这是: 错误信息 "*Traceback (most recent call last): File "/Users/gokulsrin/
我正在为 Google Cloud Vision API 使用 Python 客户端,与文档中的代码基本相同 http://google-cloud-python.readthedocs.io/en/
我正在查看 Google AutoML Vision API 和 Google Vision API。我知道,如果您使用 Google AutoML Vision API,那么它就是一个自定义模型,因
我正在查看 Google AutoML Vision API 和 Google Vision API。我知道,如果您使用 Google AutoML Vision API,那么它就是一个自定义模型,因
由于火线相机由于带宽限制而变得过时,相机制造商似乎正在转向 USB 3.0 或千兆以太网接口(interface)。两者都有许多制造商都遵守的标准 USB3 Vision 和 GigE Vision。
我是一名优秀的程序员,十分优秀!