- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个由 2 个 CUDA 文件组成的简单脚本:main.cu 和 kernel.cu。他们的目标是计算 2 个 vector 的总和。
// main.cu
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cuda.h>
#include "kernel.cu"
int main(){
/* Error code to check return values for CUDA calls */
cudaError_t err = cudaSuccess;
srand(time(NULL));
int count = 100;
int A[count], B[count];
int *h_A, *h_B;
h_A = A; h_B = B;
int i;
for(i=0;i<count;i++){
*(h_A+i) = rand() % count; /* Oppure: h_A[i] = rand() % count; */
*(h_B+i) = rand() % count; /* Oppure: h_B[i] = rand() % count; */
}
/* Display dei vettori A e B. */
printf("\nPrimi cinque valori di A = ");
for(i=0;i<4;i++){printf("%d ", A[i]);}
printf("\nPrimi cinque valori di B = ");
for(i=0;i<4;i++){printf("%d ", B[i]);}
int *d_A, *d_B;
err = cudaMalloc((void**)&d_A, count*sizeof(int));
if (err != cudaSuccess){fprintf(stderr, "Failed to allocate device vector A (error code %s)! \n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
err = cudaMalloc((void**)&d_B, count*sizeof(int));
if (err != cudaSuccess){fprintf(stderr, "Failed to allocate device vector A (error code %s)! \n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
err = cudaMemcpy(d_A, A, count*sizeof(int), cudaMemcpyHostToDevice);
if (err != cudaSuccess){fprintf(stderr, "Failed to copy vector A from host to device (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
err = cudaMemcpy(d_B, B, count*sizeof(int), cudaMemcpyHostToDevice);
if (err != cudaSuccess){fprintf(stderr, "Failed to copy vector A from host to device (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
int numThreads = 256;
int numBlocks = count/numThreads + 1;
AddInts<<<numBlocks,numThreads>>>(d_A,d_B); err = cudaGetLastError();
err = cudaMemcpy(A, d_A, count*sizeof(int), cudaMemcpyDeviceToHost);
if (err != cudaSuccess){fprintf(stderr, "Failed to copy vector C from device to host (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
err = cudaFree(d_A);
if (err != cudaSuccess){fprintf(stderr, "Failed to free device vector A (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
err = cudaFree(d_B);
if (err != cudaSuccess){fprintf(stderr, "Failed to free device vector A (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}
printf("\nPrimi cinque valori di A = ");
for(i=0;i<4;i++){printf("%d ", A[i]);}
printf("\n");
return 0;}
这是 kernel.cu 文件:
// kernel.cu
__device__ int get_global_index(){
return (blockIdx.x * blockDim.x) + threadIdx.x;
}
__global__ void AddInts(int *a, int *b){
int ID = get_global_index();
*(a+ID) += *(b+ID);
}
我 100% 确定 main.cu 脚本是正确的;我也知道我可以直接在主脚本中添加内核,但这不是我测试的目的;我也知道我可以去掉 __device__
函数并将它直接放在 __global__
中,但这也不是我的意图。
当我通过在终端中键入 nvcc main.cu kernel.cu
编译测试时,我收到以下错误消息:
/tmp/tmpxft_0000248b_00000000-30_kernel.o: In function `get_global_index()':
tmpxft_0000248b_00000000-8_kernel.cudafe1.cpp:(.text+0x15): multiple definition of ` get_global_index()'
/tmp/tmpxft_0000248b_00000000-21_main.o:tmpxft_0000248b_00000000-3_main.cudafe1.cpp:(.text+0x15): first defined here
/tmp/tmpxft_0000248b_00000000-30_kernel.o: In function `__device_stub__Z7AddIntsPiS_(int*, int*)':
tmpxft_0000248b_00000000-8_kernel.cudafe1.cpp:(.text+0x7c): multiple definition of `__device_stub__Z7AddIntsPiS_(int*, int*)'
/tmp/tmpxft_0000248b_00000000-21_main.o:tmpxft_0000248b_00000000-3_main.cudafe1.cpp:(.text+0x68e): first defined here
/tmp/tmpxft_0000248b_00000000-30_kernel.o: In function `AddInts(int*, int*)':
tmpxft_0000248b_00000000-8_kernel.cudafe1.cpp:(.text+0xe5): multiple definition of `AddInts(int*, int*)'
/tmp/tmpxft_0000248b_00000000-21_main.o:tmpxft_0000248b_00000000-3_main.cudafe1.cpp:(.text+0x6f7): first defined here
collect2: error: ld returned 1 exit status
我相信错误是由名为 get_global_index() 的设备函数的定义引起的,但我不明白它有什么问题;有谁知道这是怎么回事?
最佳答案
两种选择:
只需编译 main.cu (nvcc main.cu
) 它就会获取 kernel.cu
,因为您已经包含了它。
不要在 main.cu
中包含 kernel.cu
。
当您将 kernel.cu
包含在 main.cu
中(并将这两个文件传递给编译器)时,它会导致编译器编译code (kernel.cu) 两次,一次是在编译main.cu
的时候,一次是在编译kernel.cu
的时候。如果选择此选项,则需要在 main.cu
中为 AddInts
内核提供原型(prototype)(前向引用),也许只需包含一个头文件即可那个原型(prototype)。在更一般的情况下,如果您将内容分散到更多文件中,您可能需要将 -rdc=true
添加到您的编译命令行,如果您的文件带有 __global__
例如,在其他文件中引用 __device__
函数的函数。
关于c - 在 CUDA C 中使用简单的设备功能获取 "multiple definition"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446690/
我刚用 Latex 写完微积分的总结。 现在的主要问题是文件中包含许多我现在并不真正需要的东西。 .tex 文件包含许多我需要用心学习的定义和定理。 定义在 tex 文件中有自己的定义,因此文件中的任
所以我有一个菜单项列表,我想弄清楚我是否应该使用具有类属性的跨度或每个元素的特征的定义列表。以下是我正在考虑的两个选项: 选项 1) // HAML Markup %article.menu-item
考虑下面的代码,它试图实现 class Bar 的部分特化。 .在第一种情况下,foo成员函数是内联定义的,在第二种情况下是外联的。行外定义产生了一个我无法弄清楚的编译错误:error: out-of
我正在使用 Visual Studio Code 开发一个 typescript 项目,包括多个结构如下的 npm 包: 源代码:/src/index.ts 编译后的代码:/dist/... 当我右键
我正在编写一个神经网络类,遇到了两个我不理解的概念。谁能告诉我bias 和momentum 是什么以及做什么 最佳答案 偏差是给予神经元的恒定输入。例如在普通的前馈网络中,您可能有 2 个输入单元、2
假设我在功能文件中有一个场景,如下所示 Given I log in as "super" user When I click on login Then Home page is displayed
关闭。这个问题是opinion-based 。目前不接受答案。 已关闭去年。 已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我读了很多这个词
就像几乎任何一个已经编程了一段时间的人一样,我熟悉“生产代码”这个术语,并且对其含义有一个模糊的认识。然而,有人可以提供一个半严格的定义吗,因为维基百科和谷歌似乎不能?在生产中似乎存在很多灰色地带,例
以下代码是我认为符合伪代码条件的示例,因为它不以任何语言执行,但逻辑是正确的。 string checkRubric(gpa, major) bool brake = false nu
从宠物商店示例中获取以下#definition。给定#definition部分,可以生成JSON结构 例如 给定一个较大的复杂JSON文件,是否可以做一些相反的事情? 给定下面的JSON结构,我可以获
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
Joel Spolsky 在 SO 播客中提到了“浮出水面”。 这是什么意思?它是类似于“暴露”的东西吗,比如“暴露接口(interface)”? 最佳答案 这里引用自 podcast 51 的文字记
我不断遇到这个词的用法,但我从来不理解它的用法或所传达的含义。 像...这样的短语 "add semantics for those who read" "HTML5 semantics" "sema
我正在学习 lisp 语言(做 lisp 例程),在一般情况下我知道什么是例程,但在技术上下文中我可以谈论它,因为我现在开始学习例程。那么,例行公事的真正定义是什么?(我已经用谷歌搜索过这个,但没有找
在 definition of the haskell prelude我们看到 ... 是为无法在 Haskell 中实现的表达式保留的。例如,现在 IO monad 无法在 haskell 中实现。
问题: 原来有单个文件tcpclient.c,运行gcc -o tcpclient tcpclient.c可以顺利完成编译,并能与下载到目标板中的tcpserver成功通讯; 现在把tcpclien
我使用 ergoemacs-mode、clojuremode 和自动完成 自动完成效果很好。我应该按什么才能进入函数的定义?我习惯了 Cursive,但我想使用免费的 Emacs,我需要去定义功能。
我对 nearly.js 很陌生,我想知道与规则相比,分词器/词法分析器做了什么,根据网站: By default, nearley splits the input into a stream of
我正在使用 Gforth ,我想在定义中创建一个词。在 Gforth 的 cmd 行中,我可以输入: create foo ok 或者更具体地说,我定义了一个数组函数,它期望堆栈上的大小并创建一个带有
我是一名优秀的程序员,十分优秀!